用OpenCV进行圆标志检测的vc代码

利用OpenCV可以方便地在图像中对特殊标志进行定位,比如两个相邻的圆,就可以用cvHoughCircles,通过调节参数来稳定的识别图像中的圆,然后通过相对位置和半径约束就可以准确定位圆标志了。下面是一些示例代码,仅供参考。

    IplImage* img=cvLoadImage("D:\\circles.jpg", 1);    
    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
    CvMemStorage* storage = cvCreateMemStorage(0);
    cvCvtColor( img, gray, CV_BGR2GRAY );
    //cvNormalize(gray, gray,255, 0, CV_MINMAX);
    cvSmooth( gray, gray, CV_GAUSSIAN, 3, 3 ); // smooth it, otherwise a lot of false circles may be detected

    IplConvKernel *element=0;
    element=cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_ELLIPSE,0);

    cvDilate(gray,gray,element,2);
    cvErode(gray,gray,element,2);

    cvReleaseStructuringElement(&element);

        CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, 25, 300, 30 , 3, 35);    

        for( i = 0; i < circles->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles, i );
             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

    cout<<"圆心坐标x= "<<cvRound(p[0])<<endl<<"圆心坐标y= "<<cvRound(p[1])<<endl;
    cout<<"半径="<<cvRound(p[2])<<endl;
        }

    cvRelease((void**)&img);
    cvRelease((void**)&gray);
    cvRelease((void**)&circles);

    cvReleaseMemStorage(&storage);

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: OpenCV
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.