2012-03-12 29 views
1

私は2つの画像でfindContoursを試しました。実際、彼らは1つです。 、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); 

}

コマンドは、正しい結果を与えるモノクロ画像で動作: - 一つは、他のMSペイント(BMPモノクロ画像にエクスポート)によって色いずれかから作成され、カラー画像(JPG)であります他方は画像フレームである1つの等高線のみを返す。

2つのケースに違いはありますか? **色1を::私が使用

写真 http://imageshack.us/photo/my-images/440/picture73q.jpg/

**ビットマップ1: http://imageshack.us/photo/my-images/16/picture73l.png/

あなたは、彼らが、種類が異なるだけ同じであることがわかります

(カラー/モノクロ)私はOpenCVコードでも変換しました。

私は周りに来て、まだこの

PSでスタックしている:誰もが右ポストにアップロード画像を表示するために私を助け?ヘルプをクリックする必要はありません。

+0

イメージを提供できますか? – dom

+0

ここで画像をアップロードする方法はわかりません。基本的には、2つの画像が同じで、屋内画像にはいくつかの障害があります。 1つは色のjpg、もう1つはモノクロームで作られた –

+0

の画像をimageshack.usにアップロードし、ここにリンクを提供することができます。それは単純だ。 –

答えて

0

文書「here」を参照してください。「バイナリイメージで輪郭を見つけます」というのは、実装されたアルゴリズムの仕組みによるものです。入力画像が「8ビットシングルチャンネル画像」であることに注意してください。

を編集します。imread(、flags = 0)はグレースケールイメージを返し、ピクセルは2値化されません。これを行う1つの方法は、threshold機能を使用することです。結果イメージはfindContours()に使用できます。それがどうなるか教えてください。

編集2:ドキュメントのimreadを参照してください。はっきり言って "= 0グレイスケール画像を返す"というフラグがあります。これは二値化された画像ではありません!したがって、ここには間違いがありません。

編集3:findContoursが実際に閾値処理を行いますが、しきい値は0であるそして、あなたがより高いしきい値をしたい場合は、最初のより高い閾値で画像を2値化し、findContoursに結果画像を渡す必要があります。あなたがMSペイントをしたことは、画像をより高い閾値で二値化することです。あなたがアルゴリズムの詳細を知らなければ、これは本当に混乱することがあります。 OpenCVのドキュメントでは、深く説明することなく、すべてのことを説明しています。これらのアルゴリズムがどのように機能するかを理解するには、相当な本が必要です。私はOpenCVのドキュメントを守っているわけではありませんが、それは何の関係もありませんが、この説明で間違いはありません。初心者のユーザーは、アルゴリズムがどのように機能するかについてのより深い議論の恩恵を受ける可能性があります。

+0

私のコードはこれで正しいです: "src = imread(org_file、0); //両方ともバイナリ形式で読み込まれますか?" –

+0

編集の回答を見る – fireant

+0

私は問題を見つけたと思う。これはOpenCV APIのバグと同じです。doccument => "image - ソースである8ビットのシングルチャンネル画像です。ゼロ以外のピクセルは1として扱われ、ゼロピクセルは0のままです - イメージはバイナリとして扱われます "とGary BradskiのOpenCVは同じことを言っていますが、グレーイメージはOKです! –

関連する問題