【OpenCV学习笔记】【编程实例】五 (霍夫圆检测)

来源:互联网 发布:收购淘宝号可信吗 编辑:程序博客网 时间:2024/05/29 18:39
// GetCircle.cpp : 定义控制台应用程序的入口点。//圆形检测代码demo//载入数张包含各种形状的图片,检测出其中的圆形#include "cv.h"#include "highgui.h"#include <math.h>#include <string.h>#include <iostream>#include "windows.h"  //程序运行时间对应的头文件using namespace std;int thresh = 50;IplImage* img =NULL;IplImage* img0 = NULL;IplImage * pImg8u=NULL;CvMemStorage* storage =NULL;const char * wndname = "圆形检测  Demo";char* names[] = { "1.bmp","2.bmp","3.bmp","4.bmp","5.bmp","48.bmp","pic10.png",    "pic11.png","pic12.png","pic13.png","pic14.png",0};//char* names[] = { "5.bmp", 0};   void HoughCircle(){ CvSeq * circles=NULL; pImg8u=cvCreateImage(cvGetSize(img),8,1); CvMemStorage* storage = cvCreateMemStorage(0); cvCvtColor(img,pImg8u,CV_BGR2GRAY); //最好先cvSmooth一下,再调用cvHoughCircles cvSmooth(pImg8u,pImg8u,CV_GAUSSIAN,3,3); circles=cvHoughCircles(pImg8u,storage,CV_HOUGH_GRADIENT,       2,   //最小分辨率,应当>=1  pImg8u->height/4,   //该参数是让算法能明显区分的两个不同圆之间的最小距离  100,   //用于Canny的边缘阀值上限,下限被置为上限的一半  40,    //累加器 的阀值  2,  //最小圆半径   27  //最大圆半径  ); int k; for (k=0;k<circles->total;k++) {  float *p=(float*)cvGetSeqElem(circles,k);  if((cvRound(p[2]))>9&&(cvRound(p[2]))<14)   {  cvCircle(img,cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(0,255,0),3,CV_AA,0);       cout<<"圆心坐标"<<"("<<cvRound(p[0])<<","<<cvRound(p[1])<<")"<<endl;   //输出圆心的X,Y坐标      cout<<"圆心半径"<<cvRound(p[2])<<endl;     //输出圆的半径    }  } cvClearMemStorage( storage );}int main(int argc, char** argv){ int i, c; // create memory storage that will contain all the dynamic data for( i = 0; names[i] != 0; i++ ) {  img0 = cvLoadImage( names[i], 1 );  if( !img0 )  {   cout<<"不能载入"<<names[i]<<"继续下一张图片"<<endl;   continue;  }  img = cvCloneImage( img0 );  DWORD begin=0,end=0,cost;  begin=GetTickCount();  HoughCircle();  end=GetTickCount();  cout<<"The run time is:"<<(end-begin)<<"ms!"<<endl;//输出运行时间    cvNamedWindow( wndname, 1 );  cvShowImage(wndname,img);  c = cvWaitKey(0);  cvReleaseImage( &img );  cvReleaseImage( &img0 );  cvReleaseImage(&pImg8u);  if( (char)c == 27 )   break; } cvDestroyWindow( wndname ); return 0;}



问题提出:

        在对图像进行分析的过程中,需要识别的对象总会具有一些自己独特的几个特征,比如说实际的项目中的魔方的每个色块都是正方形的,检测硬币是圆的,等等。这些都可以用到OpenCV中的霍夫圆,直线,矩形检测等检测方法。然后进行进一步的筛选就行得到需要的对象了。

代码下载:霍夫圆检测

相关博文:

                     OpenCV中如何剔除检测到的不符合要求的对象

                                 openCV中 cvSeq的用法说明




0 0
原创粉丝点击