2016-06-22 4 views
2

find contourを使用して矩形を検出しようとしていますが、次の画像から輪郭が得られません。find contourを使用して矩形を検出しようとしています

画像内の任意の輪郭を検出できません。次の画像で輪郭が見つからないか、またはハフ変換を使用する必要がありますか?

更新:近似されたポリゴンを使用するようにソースコードを更新しました。

しかし、私はまだ外れ値の境界を得ていますが、スクリーンショットにある最小の長方形を見つけることはできません。

enter image description here

私は浸食や拡張を追加するとき、現在のソリューションは、それも仕事をdoesntの別のケースを持っています。

image 2

、ここでコード

using namespace cm; 
    using namespace cv; 
    using namespace std; 


    cv::Mat input = cv::imread("heightmap.png"); 
    RNG rng(12345); 
    // convert to grayscale (you could load as grayscale instead) 
    cv::Mat gray; 
    cv::cvtColor(input,gray, CV_BGR2GRAY); 


    // compute mask (you could use a simple threshold if the image is always as good as the one you provided) 
    cv::Mat mask; 
    cv::threshold(gray, mask, 0, 255,CV_THRESH_OTSU); 

    cv::namedWindow("threshold"); 
    cv::imshow("threshold",mask); 

    // find contours (if always so easy to segment as your image, you could just add the black/rect pixels to a vector) 
    std::vector<std::vector<cv::Point> > contours; 
    std::vector<cv::Vec4i> hierarchy; 
    cv::findContours(mask,contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
    cv::Mat drawing = cv::Mat::zeros(mask.size(), CV_8UC3); 

    vector<vector<cv::Point> > contours_poly(contours.size()); 
    vector<vector<cv::Point> > (contours.size()); 
    vector<cv::Rect> boundRect(contours.size()); 
    for(int i = 0; i < contours.size(); i++) 
    { 
     approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 3, true); 
     boundRect[i] = boundingRect(cv::Mat(contours_poly[i])); 
    } 

    for(int i = 0; i< contours.size(); i++) 
    { 
     cv::Scalar color = cv::Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
     rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 

    } 

    // display 
    cv::imshow("input", input); 
    cv::imshow("drawing", drawing); 
    cv::waitKey(0); 

答えて

0

あなたはthis questionからそのようなルックスを使用しているコードです。

閾値がBinaryInvで、白い背景に黒い形が検出されます。

あなたの例は反対ですので、代わりにBinaryしきい値タイプを使用するようにコードを微調整する(または画像を無効にする)必要があります。

FindContoursは、最大の輪郭になる画像のの周辺を検出します。

私はコードが輪郭を検出するのに失敗しているとは思っていません。あなたが期待する「最大の輪郭」ではありません。

あなたが投稿したコードは、最も明白な長方形のフィーチャがきれいなボーダーを持たないため、サンプルイメージの四角形に四角形が収まりません。リンクされた質問の中のapproxPolyDP提案が役立つかもしれませんが、ソースイメージを改善する必要があります。

これと、長方形を見つけるためのHoughメソッドの比較については、this questionを参照してください。

編集

あなたは二回Erode(3×3)を呼び出すことにより、他のブロブからあなたの例の画像で矩形を分離することができるはずです。

の正方形を選択して、最大の輪郭を選択する必要があります。

+0

私は輪郭を見つける代わりにハフ変換を使うべきだと思いますか?私に不規則な形があるので? – andre

+0

に依存します。より安定した 'findContours'でイメージスティックをクリーンアップすることができれば。 –

+0

イメージスティックをクリーンアップすることはどういう意味ですか? I begin初心者とIḿ学習。もっと説明して助けてください。ありがとうございました – andre

関連する問題