C ++ OpenCV 2.4.0 findContours与Kinect Depth Stream崩溃

时间:2012-06-03 16:26:00

标签: opencv kinect

遇到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,但我没有看到任何修复错误指向修复此问题。

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

3 个答案:

答案 0 :(得分:2)

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

我正在使用VC ++ 2010,编译器标志位于Project Properties-&gt; Linker-&gt; System下。这两个字段是:“Stack Reserve Size”“Stack Commit Size”

清除它们并重新编译后,该项目运行得非常好!

答案 1 :(得分:1)

这里有两个可能的问题。

首先,来自Kinect的原始深度流是16位(3 LSB是玩家索引,剩下的13位是以mm为单位的深度)所以如果你将这些数据复制到8位图像中,你只能得到它的一半而且它是gobbledegook 。

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

希望有所帮助。

答案 2 :(得分:1)

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