Opencv findContours为“提供了不同的结果”;“相同”;图像

Opencv findContours为“提供了不同的结果”;“相同”;图像,opencv,Opencv,我试过用两张图片来寻找恐龙。事实上,他们是一个。一个是彩色图像(jpg),另一个是由MS paint(导出为单色图像-bmp)从彩色图像创建的: #包括“cv.h” #包括“highgui.h” #包括“iostream” 使用名称空间cv; 使用名称空间std; char*org\u file=“expmap\u 1.bmp”//“expmap.jpg”;//“pic1.png”; int main(int argc,字符**argv) { Mat-src; //第一个命令行参数必须是二进制文

我试过用两张图片来寻找恐龙。事实上,他们是一个。一个是彩色图像(jpg),另一个是由MS paint(导出为单色图像-bmp)从彩色图像创建的:

#包括“cv.h”
#包括“highgui.h”
#包括“iostream”
使用名称空间cv;
使用名称空间std;
char*org\u file=“expmap\u 1.bmp”//“expmap.jpg”;//“pic1.png”;
int main(int argc,字符**argv)
{
Mat-src;
//第一个命令行参数必须是二进制文件名
//(黑白)图像
src=imread(org_文件,0);//二者都以二进制形式读取
Mat dst=Mat::零(src.rows、src.cols、CV_8UC3);
//src=src>1;
名称(“来源”,1);
imshow(“来源”,src);
矢量等值线;
向量层次;
findContours(src、等高线、层次结构、,
CV_RETR_列表、CV_链_近似_简单);
//遍历所有顶级轮廓,
//用自己的随机颜色绘制每个连接的组件
参见文档,它清楚地说“在二值图像中查找轮廓”,这是由于实现的算法的工作方式。请注意,输入图像应该是“8位单通道图像”

编辑:imread(,flags=0)返回灰度图像,且像素未进行二值化。一种方法是使用该函数。然后,结果图像可用于FindOntours()。让我知道它是如何进行的

编辑2:请参见文档中的内容。文档中明确说明标志“=0返回灰度图像”,这不是二值化图像!因此文档中没有错误


编辑3:findContours确实会进行阈值处理,但阈值为0。如果您想要更高的阈值,则必须首先以更高的阈值对图像进行二值化,然后将结果图像传递给findContours。MS paint所做的是以更高的阈值对图像进行二值化。我知道,如果您不这样做,这可能会让人非常困惑我不知道算法的细节。OpenCV文档没有深入解释所有内容,了解所有这些算法的工作原理需要一本厚厚的书。我不是在为OpenCV文档辩护,我与此无关,但我仍然认为解释中没有错误。不过,新手用户可能会从一个更为复杂的过程中受益深入讨论该算法的工作原理。

我不知道如何在此处上载图像。基本上,两幅图像是相同的,一幅是带有一些障碍物的室内图像。一幅是彩色jpg,另一幅是由彩色jpg创建的单色图像。您可以在imageshack.us上载图像并在此处提供链接。很简单。我的代码是否正确:“src=imread(org_file,0);//两者都是以二进制形式读取的”?我想我已经找到了问题所在。这就像OpenCV API document=>“图像–源代码,8位单通道图像。非零像素被视为1,零像素保留为0–图像被视为二进制"Gary Bradski的OpenCV一书也这么说。灰色图像应该没问题!!但是,就像你说的,我做了阈值处理,效果很好。奇怪!谢谢你的提示!我刚刚重新编辑了答案,如果这回答了你的问题,你应该选择它作为答案!叹气..你甚至没有读我的评论。根据reference,FindOntours甚至可以接受灰度图像。但是在现实中,有一些细微的差别。这就是为什么我称它为BUG!-)我知道了混淆的地方,我只是更新了答案。你必须理解函数行为背后的原因。如果仍然不清楚,我很乐意帮助并解释它。
#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);