用于检测轮廓的“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 指针被传递”的主要内容,如果未能解决你的问题,请参考以下文章