1

今日、C で OpenCV を使用してハフ変換を使用して円を検出するプログラムを作成しました。このプログラムは 3 つの画像を入力します。各画像には、固定された小さな円と位置が可変の大きな円が含まれています。次に、プログラムは両方の円を認識し、両方の円の中心をマークします。今私がやりたいことは、出力画像で、固定された小さな円の中心に対して、大きな円の中心の (x,y) 座標を表示する必要があることです。「circle.cpp」のコードは次のとおりです。

#include <cv.h>
#include <highgui.h>
#include <math.h>

int main(int argc, char** argv)
{
    IplImage* img;
    int n=3;
    char input[21],output[21];    

    for(int l=1;l<=n;l++)
    {     
      sprintf(input,"Frame%d.jpg",l);  // Inputs Images

      if(  (img=cvLoadImage(input))!= 0)
    {
        IplImage* gray = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
        IplImage* canny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
        IplImage* rgbcanny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
        CvMemStorage* storage = cvCreateMemStorage(0);
        cvCvtColor( img, gray, CV_BGR2GRAY );
        cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwise a lot of false circles may be detected
        cvCanny(gray,canny,50,100,3);

        CvSeq* circles = cvHoughCircles( canny, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
        int i;
        cvCvtColor(canny,rgbcanny,CV_GRAY2BGR);
        for( i = 0; i < circles->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles, i );
             cvCircle( rgbcanny, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( rgbcanny, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
        }
        cvNamedWindow( "circles", 1 );
        cvShowImage( "circles", rgbcanny );

        //Displays Output images
        sprintf(output,"circle%d.jpg",l);   
        cvSaveImage(output,rgbcanny);    
        cvWaitKey(0);
    }
}
    return 0;
}

入力画像と出力画像は次のとおりです。
ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力
ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

目的の (x,y) 座標を表示するには、コードにどのような変更を加える必要があるかを提案してください。どうもありがとう :)

4

1 に答える 1

3

画像を表示する前に、cvPutTextを使用して目的のテキストを追加します。この関数のパラメータは一目瞭然です。フォントはcvInitFontを使用して初期化する必要があります。

相対座標を計算するときは、OpenCV では座標系が次のようになることに注意してください。

-----> x
|
|
v
y

軸が別の方向を指しているシステムで相対座標を表示することに関心がある場合に備えて。

ハフ変換が正確に 2 つの円を検出したことを確認する必要があります。その場合、必要なデータはすべてcircles変数にあります。(xa,ya) が大きな円の座標で (xb,yb) が小さな円の座標である場合、相対座標は (xa-xb,ya-yb) です。

于 2011-04-27T14:49:34.117 に答える