5

この画像の中央にある 4 つのドットを検出しようとしています。 ここに画像の説明を入力 これは png に変換されたもので、実際には ppm 形式を使用しています (カメラからの生の出力からの変換後)。実際に加工した画像はこちら

私はopencvが初めてなので、これらのドットを検出するのに大きな問題があります。これが私のこれまでの最高の結果です。 ここに画像の説明を入力

ご覧のとおり、3 つのドットが検出されましたが、それ以外にも、画像内の他の多くのものが円として認識されています。

コードは次のとおりです。

    IplImage* img;
    if((img = cvLoadImage( "photos/img-000012.ppm", 1)) == 0 )
    {
        perror("cvLoadImage");
        return 1;
    }
    cvNamedWindow( "Image view", 1 );
    cvShowImage( "Image view", img );
//  cvWaitKey(0);

    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); // allocate a 1 channel byte image
    CvMemStorage* storage = cvCreateMemStorage(0);
    cvCvtColor( img, gray, CV_BGR2GRAY );
    cvShowImage( "Image view", gray );
//  cvWaitKey(0);

    cvSmooth( gray, gray, CV_GAUSSIAN, 3, 3, 0, 0 );
    cvShowImage( "Image view", gray );
    cvWaitKey(0);

    CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT,
            4,      // inverse ratio of the accumulator resolution
            1,      // minimum distance between circle centres
            100,    // higher threshold value for Canny
            20,     // accumulator threshold for the circle centers; smaller->more false circles
            1,  // minimum radius
            10 );   // maximum radius

    printf("circles == %d\n", circles->total);
    int i;
    for (i = 0; i < circles->total; i++) {
        float *p = (float*)cvGetSeqElem(circles, i);
        CvPoint center = cvPoint(cvRound(p[0]),cvRound(p[1]));
        CvScalar val = cvGet2D(gray, center.y, center.x);
        if (val.val[0] < 1) continue;
        printf("%d %d %d\n", cvRound(p[0]),cvRound(p[1]), cvRound(p[2]));
        cvCircle(img,  center, cvRound(p[2]),             CV_RGB(0,255,0), 1, CV_AA, 0);
    }
    cvShowImage( "Image view", img );
    cvWaitKey(0);

それを助ける方法はありますか?大変ありがたく存じます。人間の目で点を見つけるのはとても簡単だと思うので、コンピューターを使って検出できるようになることを願っています。

4

2 に答える 2

4

この投稿をご覧ください。

それに基づいて開発しているアプリケーションを使用すると、次のようになりました。

ここに画像の説明を入力

基本的に、この方法を自分のケースに合わせて、より効率的にすることができます: "5." (「形状の付与で輪郭を検証または無効化します(サイズ、面積、凸面...」)。あなたの場合、円のクラスターがないため、はるかに厳密になる可能性があります。ほぼ完璧なオブジェクトをマップするだけで済みますcircles .さらに、円のサイズ/相対強度が同じであることを知っています...

不明な点があれば言ってください、

幸運を、

于 2012-08-05T13:15:45.580 に答える
0

ハフ変換は最良のケースではないと思います。おそらく、それらをセグメント化し、色と幾何学的パラメーターを使用して簡単に認識することができます。

于 2012-08-05T12:14:34.617 に答える