C++ OpenCV 2.4.0 findContours 因 Kinect 深度流而崩溃

Posted

技术标签:

【中文标题】C++ OpenCV 2.4.0 findContours 因 Kinect 深度流而崩溃【英文标题】:C++ OpenCV 2.4.0 findContours crashing with Kinect Depth Stream 【发布时间】:2012-06-03 16:26:00 【问题描述】:

遇到一个问题,opencv 2.4.0 findContours 函数不断崩溃。不幸的是,我很难确定这个问题。希望有人遇到过类似的问题。

我正在使用 Microsoft K4W SDK 1.5 从 Kinect 传感器捕获深度流,将其复制到 OpenCV Mat,然后通过 cvtColor 和阈值将其转换为 8UC1 图像。我运行 countNonZero 只是为了确保图像在传递给 findContours 之前不是空白的。但即使是最简单的 findcountours 实现也会崩溃。

这是我的基本代码:

rawdepth = Mat(Size(640,480),CV_8UC4);
thresh = Mat::zeros(640,480,CV_8UC1);

// storage for contours 
vector<vector<Point>> contours;

cvtColor(rawdepth,thresh,CV_RGB2GRAY);
threshold(thresh,thresh,0,255,THRESH_BINARY);

if(countNonZero(thresh) > 100 ) 
    // This crashes
    findContours(thresh,contours,RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);           
 

我确实验证了传递给 findcontours 的实际 Mat 是单通道图像并且它不是空白的(即,有大约 500 多个点)。但是我想知道这是否是与堆或线程相关的问题,因为我听说 findcontours 实际上可以修改输入 Mat?

此时我将尝试使用刚刚发布的 OpenCV 2.4.1,尽管我没有看到任何可以解决此问题的已修复错误。

任何想法都非常感谢......

【问题讨论】:

您是否将崩溃追溯到findContours() 是的。事实上,那时我可以在同一张图像上运行 Canny 等其他功能,并且效果很好。我还验证了传递给 findContours 的“thresh”Mat 是单通道图像。 【参考方案1】:

问题原来是编译器标志将程序的堆栈使用限制为 10MB(10,000,000 字节)。不幸的是,这对于我正在捕捉的 Kinect 视频来说还不够。删除编译器标志后,findContours 现在将编译并正常工作!

我使用的是 VC++ 2010,编译器标志位于 Project Properties->Linker->System 下。这两个字段是:“堆栈保留大小”“堆栈提交大小”

清除它们并重新编译后,项目运行良好!

【讨论】:

【参考方案2】:

这里有两个可能的问题。

首先,来自 Kinect 的原始深度流是 16 位(3 LSB 是播放器索引,其余 13 位是以毫米为单位的深度),因此如果您将该数据复制到 8 位图像中,您只会得到其中的一半,而且它是 gobbledegook .

其次,OpenCV 针对调试和发布配置进行了不同的编译。如果您使用调试配置文件进行编译,则需要使用调试库(版本#d)。所以要使用 cv::findContours,你需要 opencv_imgproc240.[lib/dll] 和 opencv_core240.[lib/dll]。如果您使用了错误的配置,cv::namedWindow / cv::imshow(对于调试非常方便)或 cv::findContours 都不会正常工作。

希望对您有所帮助。

【讨论】:

【参考方案3】:

我想说明我在 findContours() 方法的崩溃方面遇到了同样的问题,如第二个答案中所述,问题是我使用的是非调试版本的 opencv_imgproc240.dll 和 opencv_core240.dll在Debug模式下,改成XXd.dll即可解决问题。

【讨论】:

这应该是对现有答案的评论,而不是答案本身。

以上是关于C++ OpenCV 2.4.0 findContours 因 Kinect 深度流而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

python+opencv2快速找出一组点包围的区域中的所有点

在 python 中使用 OpenCV 2.4.0 创建视频

yum 安装OpenCv 怎么没有头文件

c++结合opencv能给载入图像并处理,我想知道,c++结合啥,可以实现处理gif图像

无法使用 OpenCV 4 (C++) 创建 FisherFaceRecognizer

图像轮廓检测错误:OpenCV、C++