用于检测轮廓的“NULL 指针被传递”

Posted

技术标签:

【中文标题】用于检测轮廓的“NULL 指针被传递”【英文标题】:"NULL pointer is passed" for detecting contours 【发布时间】:2012-10-24 10:18:47 【问题描述】:

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

【问题讨论】:

但是你知道哪个函数调用会导致错误。因此,只需在调用它之前添加一个 NULL 检查。顺便说一句,看到一些代码会很好。 感谢您的回复。该代码链接在帖子中的“程序”一词处。你能解释更多关于 NULL 检查的信息吗?我不会放弃的。 我必须检查一下我的眼睛。无论如何,我添加了一个答案:-) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

在这段代码中:

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;

...如果current_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

【讨论】:

感谢您的回答。我已经尝试过continue 函数,如您的建议和if (contours == NULL) 行,如@RichardSchneider 的建议,但我收到此错误:Bad flag (parameter or structure field) (Unregconized or unsupported array type)。另外,我不认为cvMoments 是原因,因为我已经尝试过没有cvMoments 功能的程序,但仍然收到错误消息。 如果您不确定是什么触发了错误,恐怕最快的调试方法是在每次调用库函数之前添加fprintf(stderr, "Now calling %s\n", "FUNCTION_NAME");。然后你就可以确定哪个调用使用了错误的指针。 我傻了,我已经找到了Bad flag 错误源。该错误与轮廓无关。现在程序工作得很好。谢谢

以上是关于用于检测轮廓的“NULL 指针被传递”的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实战(15)——轮廓检测详解

OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

从图像边缘到物体轮廓

教你如何使用 OpenCV检测图像中的轮廓

教你如何使用 OpenCV检测图像中的轮廓

图像与轮廓检测-轮廓检测