5

この黒いポリゴンの周りの輪郭を識別しようとしましたが、それらのポイントにアクセスする必要がありますが、うまくいきません。これは入力画像です ここに画像の説明を入力してください

しかし、次のコードを実行しようとすると、期待した結果が得られなかったため、期待どおりの結果が得られませんでした。

        CanvasFrame cnvs=new CanvasFrame("Polygon");
        cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

        CvMemStorage storage=CvMemStorage.create();
        CvSeq squares = new CvContour();
        squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage);
        String path="project/Test/img/black.png";
        IplImage src = cvLoadImage(path);
        IplImage gry=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
        cvCvtColor(src, gry, CV_BGR2GRAY);
        cvThreshold(gry, gry, 230, 255, CV_THRESH_BINARY_INV);
        cnvs.showImage(gry);
        cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
        CvSeq ss=null;
        CvSeq tmp=null;
        int ii=0;
            for (ss=squares; ss!=null; ss=ss.h_next()) {
                tmp=cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0);
                System.out.println("index "+ii+" points "+tmp.total()+" area "+cvContourArea(ss, CV_WHOLE_SEQ, 0));
                cvDrawContours(src, ss, CvScalar.RED, CV_RGB(248, 18, 18), 1, -1, 8);
                //drawPoly(src, tmp);
            }
        IplConvKernel mat=cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT, null);
        cvDilate(src, src, mat, CV_C);
        cvErode(src, src, mat, CV_C);
        cnvs.showImage(src);
        saveImage("nw.png", src);

しかし、私が出力をチェックするとき、それは与えるだけです

インデックス0ポイント8エリア20179.0

つまり、ポリゴンの8ポイントのみを識別しますが、12ポイントである必要があります。このコードの問題を誰かに説明してもらえますか。

これは出力画像を表示します

ここに画像の説明を入力してください

4

1 に答える 1

1

cvApproxPoly() 関数は、曲線近似にRamer–Douglas–Peuckerアルゴリズムを使用します。アルゴリズムの目的は、より少ないポイントで類似の曲線を見つけることです。アルゴリズム自体は、入力として 2 つのパラメーターを受け取ります。

  • ポイント(頂点)のリスト、
  • 近似精度。

簡単に言えば、近似精度の値が大きいほど、近似曲線でポイントが省略される可能性が高くなります (Wikipedia の記事、特にこのアニメーションを参照してください)。関数呼び出しで:

cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0);

5 番目のパラメータは近似精度です。頂点の数を減らしたくない場合は、値を小さくする必要があります (この例では、約 1 の値で正確に 12 個の頂点が得られるため、概算はありません)。

于 2012-10-27T21:32:52.750 に答える