OpenCV“findContours”方法错误

时间:2014-01-16 22:02:18

标签: c++ opencv

我遇到了OpenCV 2.4.8的“findContours”方法的问题。特别是以下错误:

OpenCV Error: Unsupported format or combination of formats ([Start]FindContours support only 8uC1 and 32sC1 images) in cvStartFindContours, file ..\..\..\..\opencv\modules\imgproc\src\contours.cpp, line 196

从消息的内容来看,我似乎使用的是不合适的图像格式,但我非常确定我的代码指定了8uC1(8位1通道)矩阵。

/* Threshold source image (src1 which is a grayscale image) */
Mat threshImg(src1.rows, src1.cols, CV_8UC1);
threshold(src1, threshImg, thresh, 255, CV_THRESH_BINARY);

/* Get contours */
Mat threshCopy = threshImg; // Copying image because findContours method edits image data
std::vector<std::vector<Point>> contours;
findContours(threshCopy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0,0));

我正在使用cl和link在命令行上编译代码,如下所示:

$: cl NameOfCode.cpp -W2 -EHsc -c -I OpenCVIncludeDirectory
$: link NameOfCode.obj -LIBPATH:OpenCVLibraryDirectory opencv_core248.lib opencv_highgui248.lib opencv_imgproc248.lib

要启用cl和链接的使用,请从Visual Studio 2010运行vsvars32.bat:

$: "C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"

2 个答案:

答案 0 :(得分:0)

我重写了你的代码,我觉得你可以尝试一下。

//Copy the src1 image to threshImg
Mat threshImg = src1.clone(); 
//Covert the threshImg from 8-channel to 1-channel and threshold it to binary image.
cvtColor(threshImg,threshImg, CV_RGB2GRAY); 
threshold(src1, threshImg, thresh, 255, CV_THRESH_BINARY);
//Finnaly you can get a contours.
Mat threshCopy = threshImg.clone;
std::vector<std::vector<Point>> contours;
findContours(threshCopy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0,0));

答案 1 :(得分:0)

看起来问题最终与Visual Studio相关。安装SP1 http://www.microsoft.com/en-us/download/details.aspx?id=23691并根据berak和vasan的建议调整代码。最终代码如下:

/* NOTE: Using namespace cv & std */

/* Get input image */
Mat origImg = imread("C:\\PathToImage\\Image.png", CV_LOAD_IMAGE_GRAYSCALE);

/* Threshold input image */
Mat threshImg;
threshold(origImg, threshImg, 150, 255.0, THRESH_BINARY);

/* Get contours from threshold image */
Mat copyImage = threshImg.clone();
vector<vector<Point>> contours;
findContours(copyImage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0,0));