织梦CMS - 轻松建站从此开始!

罗索

关于YUV空间的cvHoughCircles()圆的检测

jackyhwei 发布于 2011-04-29 13:45 点击:次 
这个函数的src要求是灰度图像,我将它的输入图像改成Y图像,然后将找到的圆在原来图像上画出来,有很大的偏移,而将找到的圆在Y图像上画出来,位置正确.可能是因为RGB转YUV时,图像坐标发生了偏移的缘故
TAG:

这个函数的src要求是灰度图像,
我将它的输入图像改成Y图像,
然后将找到的圆在原来图像上画出来,有很大的偏移,而将找到的圆在Y图像上画出来,位置正确.
可能是因为RGB转YUV时,图像坐标发生了偏移的缘故,
因此可以如下处理:

  1. #include <cv.h> 
  2. #include <highgui.h> 
  3. #include <math.h> 
  4.  
  5. int main(int argc, char** argv) 
  6.     IplImage* img; 
  7.     IplImage* pImg = NULL; 
  8.     IplImage* pImgChannels[4] = { 0, 0, 0, 0 }; 
  9.     int i = 0; 
  10.     if( argc >= 2 && (img=cvLoadImage(argv[1], 1))!= 0) 
  11.     { 
  12.         
  13.         pImg = cvCreateImage( cvGetSize(img), 
  14.             img->depth, 
  15.         img->nChannels); 
  16.         cvCvtColor( img, pImg, CV_BGR2YCrCb); 
  17.         for( i = 0; i < img->nChannels; i++ ) 
  18.         { 
  19.             pImgChannels[i] = cvCreateImage( cvGetSize(img), 
  20.                 img->depth, 
  21.                 1); 
  22.         } 
  23.         
  24.         //pFrame 
  25.         cvSplit( img, pImgChannels[0], pImgChannels[1], 
  26.             pImgChannels[2], 
  27.             pImgChannels[3] ); 
  28.         cvFlip( pImgChannels[0], pImgChannels[0], 0); 
  29.         cvFlip( pImgChannels[1], pImgChannels[1], 0); 
  30.         cvFlip( pImgChannels[2], pImgChannels[2], 0); 
  31.  
  32.         IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); 
  33.         CvMemStorage* storage = cvCreateMemStorage(0); 
  34.     //    cvCvtColor( img, gray, CV_BGR2GRAY ); 
  35.         cvSmooth( pImgChannels[0], pImgChannels[0], CV_GAUSSIAN, 9, 9 );
  36.  // smooth it, otherwise a lot of false circles may be detected 
  37.         cvNamedWindow( "gray", 1 ); 
  38.         cvShowImage( "gray", pImgChannels[2] ); 
  39.         CvSeq* circles = cvHoughCircles( pImgChannels[0], storage
  40. , CV_HOUGH_GRADIENT, 2, 4*pImgChannels[0]->height, 40, 40 ); 
  41.         
  42.         for( i = 0; i < circles->total; i++ ) 
  43.         { 
  44.             float* p = (float*)cvGetSeqElem( circles, i ); 
  45.             cvCircle( pImgChannels[0], cvPoint(cvRound(p[0]),cvRound(p[1]))
  46. , 3, CV_RGB(0,255,0), -1, 8, 0 ); 
  47.             cvCircle( pImgChannels[0], cvPoint(cvRound(p[0]),cvRound(p[1]))
  48. , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 ); 
  49.             cvCircle( pImgChannels[1], cvPoint(cvRound(p[0]),cvRound(p[1]))
  50. , 3, CV_RGB(0,255,0), -1, 8, 0 ); 
  51.             cvCircle( pImgChannels[1], cvPoint(cvRound(p[0]),cvRound(p[1]))
  52. , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 ); 
  53.             cvCircle( pImgChannels[2], cvPoint(cvRound(p[0]),cvRound(p[1]))
  54. , 3, CV_RGB(0,255,0), -1, 8, 0 ); 
  55.             cvCircle( pImgChannels[2], cvPoint(cvRound(p[0]),cvRound(p[1]))
  56. , cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 ); 
  57.         } 
  58.         
  59.         cvMerge( pImgChannels[0], pImgChannels[1], pImgChannels[2], pImgChannels[3], img ); 
  60.         cvNamedWindow( "circles", 1 ); 
  61.         cvShowImage( "circles", img ); 
  62.     //    cvSaveImage( argv[2], img ); 
  63.         cvWaitKey( 0 ); 
  64.     } 
  65.     return 0; 

 

(ecice)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201104/11350.html]
本文出处:百度博客 作者:ecice
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容