"传递NULL指针"用于检测轮廓

时间:2012-10-24 10:18:47

标签: c++ c opencv

The program我正在研究的是一种轮廓检测程序,它可以过滤捕获帧中最大的轮廓,用红色绘制它并打印出对象的中心坐标。有时当我调试程序时,我收到此错误消息:

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

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

提前致谢。干杯

P / S:检测到轮廓后,程序运行正常。目前正在使用OpenCV 2.4.2

2 个答案:

答案 0 :(得分:1)

我建议,如果找不到轮廓,就会忘记处理帧。

cvFindContours( src_gray, storage, &contours, sizeof(CvContour), 
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
if(contours==NULL)
   continue;

答案 1 :(得分: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开始成为NULL并且current_contour没有“保存优惠”,那么最终NULL等于contours2 (在处理开始时也是NULL)。

稍后,contours NULL无关紧要,因为contours2largest_contour“恢复”,正如您所注意到的那样

  

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

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

然后,NULL永远不会更改其初始cvMoments(largest_contour, &moments, 1); 值。

我怀疑这不符合以下几行:

if (largest_contour)
    cvMoments(largest_contour, &moments, 1);
else
    continue; // loop to next frame

我将在

中修改
{{1}}