4

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

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

4

3 回答 3

2

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

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

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

于 2012-07-05T01:02:40.417 回答
1

这里有两个可能的问题。

首先,来自 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 都不会正常工作。

希望有帮助。

于 2012-06-22T10:22:33.423 回答
1

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

于 2012-09-12T02:50:47.590 回答