2012-03-12 61 views
1

我試過了2個圖像的findContours。其實,它們是一個。一個是彩色圖像(JPG),另一種是從由MS塗料顏色之一創建(出口到單色圖像 - BMP):findContours爲「相同」圖像提供了不同的結果

#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個輪廓,即圖像幀。

2例有什麼區別嗎?

照片,我用: **顏色之一: http://imageshack.us/photo/my-images/440/picture73q.jpg/

**位圖中: http://imageshack.us/photo/my-images/16/picture73l.png/

你可以看到,他們是一樣的,只是類型不同(彩色/黑白)我也在OpenCV代碼中進行了轉換。

我來到我身邊還停留在這個

PS:任何人都可以幫助我,以顯示上傳圖片就在崗位?這樣助手就不必點擊查看

+0

你能提供這些圖片嗎? – dom 2012-03-12 16:21:16

+0

我不知道如何在這裏上傳圖片。基本上,兩個圖像是相同的,一個室內圖像有一些障礙。一個是彩色JPG,另一個是彩色 – 2012-03-13 07:12:55

+0

創建的單色,您可以在imageshack.us上傳圖像並在此處提供鏈接。很簡單。 – 2012-03-13 13:53:10

回答

0

請參閱文檔here,它明確指出「在二進制圖像中查找輪廓」,這是由於實現的算法的工作原理。並注意輸入圖像應該是「8位單通道圖像」。

編輯:imread(,flags = 0)返回一個灰度圖像,並且像素不是二值化的。一種方法是使用threshold函數。然後結果圖像可以用於findContours()。讓我知道事情的後續。

編輯2:參見文檔中的imread。這是明確指出的標誌「= 0返回灰度圖像」,這不是一個二值化的圖像!因此在文檔中沒有錯誤。

編輯3:findContours確確實閾值,但門檻爲0如果你想有一個較高的門檻,你必須首先在較高的門檻值化圖像和結果圖像傳遞給findContours。你所做的MS油漆是在更高的閾值下對圖像進行二值化處理。我知道如果你不知道算法的細節,這可能會讓你感到困惑。 OpenCV文檔並沒有做深入的解釋,理解所有這些算法的工作原理都需要一本大書。我並沒有捍衛OpenCV文檔,這與我無關,但我仍然沒有看到解釋中的錯誤。儘管如此,新手用戶也許可以從更深入的算法工作方式中獲益。

+0

是我的代碼正確:「src = imread(org_file,0); //二者都以二進制形式讀取」? – 2012-04-17 09:31:59

+0

查看編輯答案 – fireant 2012-04-17 11:43:40

+0

我想我已經找到了問題。這就像OpenCV API doccument =>「image - 源代碼,一個8位單通道圖像的bug。非零像素被視爲1,零像素保持爲0 - 圖像被視爲二進制「,加利布拉德斯基的書OpenCV也說過同樣的事情,灰色圖像應該是OK !!但是,就像你說的,我做了並且它的工作原理很奇怪!謝謝你的提示! – 2012-04-17 14:24:13

相關問題