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