findContours为“相同”图像提供了截然不同的结果

时间:2012-03-12 12:17:05

标签: opencv

我尝试过带有2张图片的findContours。实际上,他们是一体的。一个是彩色图像(jpg),另一个是由MS绘制的颜色创建的(导出为单色图像 - bmp):

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace cv;
using namespace std;

char* org_file =  "expmap_1.bmp"; //"expmap.jpg"; // "pic1.png";  

int main( int argc, char** argv )
{
Mat src;
// the first command line parameter must be file name of binary
// (black-n-white) image

src = imread(org_file, 0);  // both are read in binary form


Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);


//  src = src > 1;
namedWindow( "Source", 1 );
imshow( "Source", src );

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

findContours( src, contours, hierarchy,
CV_RETR_LIST  , CV_CHAIN_APPROX_SIMPLE );

// iterate through all the top-level contours,
// draw each connected component with its own random color

cout << contours.size() << endl;

int idx = 0;
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
//  Scalar color( rand()&255, rand()&255, rand()&255 );
//Scalar color(255,255,255);
drawContours( dst, contours, idx, RGB(0,0,255), 1, 8, hierarchy );
}

namedWindow( "Components", 1 );
imshow( "Components", dst );
waitKey(0);

}

该命令适用于单色图像,给出正确的结果,但另一个只返回1个轮廓,即图像帧。

两种情况之间有什么区别吗?

我用的图片: **颜色一: http://imageshack.us/photo/my-images/440/picture73q.jpg/

**位图一: http://imageshack.us/photo/my-images/16/picture73l.png/

你可以看到它们是相同的,只是我在OpenCV代码中转换的类型(颜色/单色)不同。

我来了,仍然坚持这个

PS:有人帮我在帖子中显示上传图片吗?这样帮助者就不必点击查看

1 个答案:

答案 0 :(得分:0)

请参阅文档here,它清楚地说明了“在二进制图像中查找轮廓”,这是由于实现的算法的工作方式。并注意输入图像应为“8位单通道图像”。

编辑:imread(,flags = 0)返回灰度图像,像素未二进制化。一种方法是使用threshold函数。然后结果图像可用于findContours()。让我知道它是怎么回事。

编辑2 :请参阅文档中的imread。它清楚地标明了标志“= 0返回灰度图像”,这不是二值化图像!因此,文档中没有错误。

编辑3 :findContours确实进行阈值处理,但阈值为0.如果您想要更高的阈值,则必须先将图像二值化为更高的阈值,然后将结果图像传递给findContours。你做了什么MS绘画将图像二值化为更高的阈值。我知道如果您不了解算法的细节,这可能会让您感到困惑。 OpenCV文档并不深入并解释所有内容,了解所有这些算法的工作原理需要大量的书籍。我不是在为OpenCV文档辩护,这与我没有任何关系,但我仍然没有看到解释中的错误。但是,新手用户也许可以从对算法如何工作的更深入的讨论中受益。