2

我正在处理的程序是一个轮廓检测程序,它过滤我们在捕获帧中的最大轮廓,将其涂成红色并打印出对象的中心坐标。有时当我调试程序时,我会收到以下错误消息:

OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ......../array.cpp line 2382

我已经搜索了问题的根源,并发现如果第一个(和下一个)捕获的帧中没有检测到轮廓(轮廓为 NULL),程序将崩溃。直到现在,我还没有找到任何解决方案让这个程序忽略错误,直到至少检测到一个轮廓。那么关于如何阻止这个问题发生的任何线索?

提前致谢。干杯

P/S:检测到轮廓后,程序就可以正常工作了。目前使用 OpenCV 2.4.2

4

2 回答 2

1

我建议,如果你找不到轮廓,你就忘记处理框架。

cvFindContours( src_gray, storage, &contours, sizeof(CvContour), 
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
if(contours==NULL)
   continue;
于 2012-10-24T10:32:15.517 回答
1

在这段代码中:

CvSeq* largest_contour = NULL;
...
while (current_contour != NULL){
    double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));       
    if(area > largestArea){
        largestArea = area;
        largest_contour = current_contour;
    }
    current_contour = current_contour->h_next;
}

...您最终可能会largest_contour等于NULLifcurrent_contour开始是它自己NULL,并且没有“可取之处” contours2(它本身也在NULL处理开始时)。

稍后,正如你所注意到的,contours存在NULL并不重要,因为它被“恢复”了contours2

检测到轮廓后,程序将正常工作

但在第一帧,这不可能发生。

然后,largest_contour永远不会NULL改变它的初始值。

我怀疑这与以下行不符:

cvMoments(largest_contour, &moments, 1);

然后我会修改

if (largest_contour)
    cvMoments(largest_contour, &moments, 1);
else
    continue; // loop to next frame
于 2012-10-24T10:39:30.140 回答