opencv 2.4.0 findContours函数不断崩溃时遇到问题。不幸的是,我很难找到问题所在。希望有人遇到类似的问题。
我使用Microsoft K4W SDK 1.5从Kinect传感器捕获深度流,将其复制到OpenCV Mat,然后通过cvtColor和threshold将其转换为8UC1图像。我运行countNonZero,只是为了确保在将图像传递给findContours之前图像不是空的。但即使是最简单的FindCountors实现也会崩溃。
这是我的基本代码:
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);
}
我确实验证了被传递到findcontour的实际垫是一个单通道图像,并且它不是空白的(即,有大约500个点)。但是我想知道这是否是一个堆或线程相关的问题,因为我听说findcontour实际上可以修改输入Mat?
在这一点上,我将尝试使用刚刚发布的OpenCV 2.4.1,尽管我没有看到任何修复的错误来解决这个问题。
任何想法都非常感谢...
问题是编译器标志将程序的堆栈使用限制在10MB(10,000,000字节)。不幸的是,这对我拍摄的Kinect视频来说还不够。删除编译器标志后,findContour现在将编译并正常工作!
我使用的是VC2010,编译器标志在项目属性下-
在清除它们并重新编译之后,项目运行得非常漂亮!
这里有两个可能的问题。
首先,来自Kinect的原始深度流是16位(3个LSB是播放器索引,其余13位是深度,单位为mm),因此,如果您将该数据复制到8位图像中,您只能得到其中的一半,这是GobbleDeBook。
其次,对于调试和发布配置,OpenCV的编译方式不同。如果使用调试配置文件进行编译,则需要使用调试库(版本#d)。因此,要使用cv::findContours,您需要opencv_imgproc240。[lib/dll]和opencv_core240。[lib/dll]。如果使用了错误的配置,则cv::namedWindow/cv::imshow(对于调试来说非常方便)或cv::findContours都无法正常工作。
希望有帮助。
我想指出,我有同样的问题,关于findContour()方法的崩溃,如第二个答案中提到的,问题是我在调试中使用了opencv_imgproc240.dll和opencv_core240.dll的非调试版本模式,改成XXd.dll解决了问题。