2

我正在使用 C++ 进行一些OpenCV 2.4.4对象检测。不幸的是,我必须检测的那些对象没有独特的形状,但它们在 HSV 颜色空间中确实有一些非常特定的颜色范围(现在我正在检测一些红色对象)。

此外,对象应该只出现在图像的某些部分,所以我没有扫描所有图像,此外,在这个 ROI 下我有子 ROI(小矩形,我需要知道这些矩形中的哪个对象在一个框架中)。

所以,首先我试图检测它在大 ROI 中发现了一些东西,如果是的话,我将它设置为与我的环境不同的颜色。我用下面的代码做到了:

cvtColor(frame(Range(0,espv),Range::all()),framhsv,CV_BGR2HSV); 
MatIterator_<Vec3b> it, ith, end, endh;
ith  = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it   = (frame(Range(0,espv),Range::all())).begin<Vec3b>(); 
for (;ith != endh; ++it,++ith){
    if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
        (*it)[0] = 63;
        (*it)[1] = 0;
        (*it)[2] = 255;}}

一切正常,物体被“检测到”,所以我转到下一个陡峭的地方,检测物体是否在每个子 ROI 中。为此,我创建了以下函数,返回每个子 ROI 中“检测到”像素的数量,因此我可以考虑哪个是正确的子 ROI。

这是功能:

Vector<int> CountRed(cv::Mat &frame, int hspa, int vspa, int nlines ,int nblocks){
    Vector<int> count(nblocks*nlines,0);
    for(int i = 1; i<= nlines; i++){
        for(int j = 1; j<= nblocks; j++){

            Mat framhsv;
            cvtColor(frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa)),framhsv,CV_BGR2HSV); //Converte somente a área de interesse para HSV

            MatIterator_<Vec3b> it, ith, endh;
            ith  = framhsv.begin<Vec3b>();
            endh = framhsv.end<Vec3b>();
            it   = (frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa))).begin<Vec3b>();

            for (;ith != endh; ++it,++ith){
                if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
                    (*it)[0] = 63;
                    (*it)[1] = 0;
                    (*it)[2] = 255;
                    count[(j)+nblocks*(i-1)-1]++;}}}}
return count;
}

代码编译时没有警告或错误,并且视频显示,但如果我在 ROI 的任何部分插入我必须检测到的对象,则代码停止工作,如果我删除以下内容也会发生这种情况:

count[(j)+nblocks*(i-1)-1]++;

线。我收到以下错误: Access violation writing location 0xFFFFF970.

我真的认为问题一定出在不使用时访问迭代器Range::All()

为了澄清我在这里所做的是一个框架的图像:http: //i.imgur.com/Irvr8bk.jpg

紫色区域是框架,红色区域是 ROI,每个黑色区域是子 ROI。

我也尝试使用frame(Rect(0,0,frame.cols,2*vspa)来定义 ROI,它也有效,但是在尝试使用cv::Rect. MatIterator_所以,我真的认为在不访问完整的行结构时这一定是一个错误。

那么,我应该如何处理这些子 ROI 呢?

4

0 回答 0