我正在使用 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 呢?