3

単一チャンネルの空白の画像に円、線、長方形を描くコードを書いています。その後、画像の輪郭を見つけて、すべての輪郭を正しく取得しています。しかし、輪郭を見つけた後、ソース画像が歪んでいます。なぜこれが起こっているのですか?誰でも私がそれを解決するのを助けることができます。そして、私のコードは以下のようになります。

using namespace cv;
using namespace std;
int main()
{

    Mat dst = Mat::zeros(480, 480, CV_8UC1);
    Mat draw= Mat::zeros(480, 480, CV_8UC1);

    line(draw, Point(100,100), Point(150,150), Scalar(255,0,0),1,8,0);
    rectangle(draw, Rect(200,300,10,15),  Scalar(255,0,0),1, 8,0); 
    circle(draw, Point(80,80),20, Scalar(255,0,0),1,8,0);

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

    findContours( draw, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

     for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color( 255,255,255);
        drawContours( dst, contours, i, color, 1, 8, hierarchy );
    }

    imshow( "Components", dst );
    imshow( "draw", draw );

    waitKey(0);
}

ソース画像

ここに画像の説明を入力

輪郭を見つけた後の歪んだソース

4

4 に答える 4

2

使ってみて findContours( draw.clone(), contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

于 2016-07-12T17:37:28.480 に答える
1

問題は、findContours から完璧なプロットを期待していて、醜い描画が得られることだと思います。

FindContours は、図の正確なプロットを提供するつもりはありません。適切な画像を生成するには、drawContours を使用する必要があります。

ここで参照を見てください: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours

最初のパラメーターが入力/出力配列であることがわかります。したがって、関数は同じ配列を使用して、画像を開き、変更し、保存します。そのため、歪んだイメージが得られます。

さらに、パラメーターの説明を参照してください。最初のパラメーターについて話すと、「関数は輪郭を抽出しながら画像を変更します」と書かれています。

私はfindContoursをあまり使っていませんが、自分が望んでいたものの明確なイメージはありませんでした。素敵なプロットを得るには、常に drawContours を使用する必要があります。

それ以外の場合は、輪郭の代わりにエッジを提供する Canny 関数を使用できます。

于 2013-06-18T09:29:56.247 に答える