这个函数的src要求是灰度图像,
我将它的输入图像改成Y图像,
然后将找到的圆在原来图像上画出来,有很大的偏移,而将找到的圆在Y图像上画出来,位置正确.
可能是因为RGB转YUV时,图像坐标发生了偏移的缘故,
因此可以如下处理:
- #include <cv.h>
- #include <highgui.h>
- #include <math.h>
-
- int main(int argc, char** argv)
- {
- IplImage* img;
- IplImage* pImg = NULL;
- IplImage* pImgChannels[4] = { 0, 0, 0, 0 };
- int i = 0;
- if( argc >= 2 && (img=cvLoadImage(argv[1], 1))!= 0)
- {
-
- pImg = cvCreateImage( cvGetSize(img),
- img->depth,
- img->nChannels);
- cvCvtColor( img, pImg, CV_BGR2YCrCb);
- for( i = 0; i < img->nChannels; i++ )
- {
- pImgChannels[i] = cvCreateImage( cvGetSize(img),
- img->depth,
- 1);
- }
-
-
- cvSplit( img, pImgChannels[0], pImgChannels[1],
- pImgChannels[2],
- pImgChannels[3] );
- cvFlip( pImgChannels[0], pImgChannels[0], 0);
- cvFlip( pImgChannels[1], pImgChannels[1], 0);
- cvFlip( pImgChannels[2], pImgChannels[2], 0);
-
- IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
- CvMemStorage* storage = cvCreateMemStorage(0);
-
- cvSmooth( pImgChannels[0], pImgChannels[0], CV_GAUSSIAN, 9, 9 );
-
- cvNamedWindow( "gray", 1 );
- cvShowImage( "gray", pImgChannels[2] );
- CvSeq* circles = cvHoughCircles( pImgChannels[0], storage
- , CV_HOUGH_GRADIENT, 2, 4*pImgChannels[0]->height, 40, 40 );
-
- for( i = 0; i < circles->total; i++ )
- {
- float* p = (float*)cvGetSeqElem( circles, i );
- cvCircle( pImgChannels[0], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , 3, CV_RGB(0,255,0), -1, 8, 0 );
- cvCircle( pImgChannels[0], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
- cvCircle( pImgChannels[1], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , 3, CV_RGB(0,255,0), -1, 8, 0 );
- cvCircle( pImgChannels[1], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
- cvCircle( pImgChannels[2], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , 3, CV_RGB(0,255,0), -1, 8, 0 );
- cvCircle( pImgChannels[2], cvPoint(cvRound(p[0]),cvRound(p[1]))
- , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
- }
-
- cvMerge( pImgChannels[0], pImgChannels[1], pImgChannels[2], pImgChannels[3], img );
- cvNamedWindow( "circles", 1 );
- cvShowImage( "circles", img );
-
- cvWaitKey( 0 );
- }
- return 0;
- }
(ecice) |