【OpenCV学习笔记】【编程实例】五 (霍夫圆检测)
2014-09-14 18:08
543 查看
// 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的用法说明
相关文章推荐
- 【OpenCV学习笔记】【编程实例】六 (霍夫圆检测续)
- 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
- 【OpenCV学习笔记】【编程实例】四(获取一个或多个感兴趣区域)
- 【OpenCV学习笔记】【编程实例】三(将一个图像中的指定区域拷贝到另一个图像的指定区域
- 【OpenCV学习笔记】【编程实例】二(图像的旋转和翻转)
- OpenCV学习笔记-霍夫圆变换
- 我的OpenCV学习笔记(17):利用形态学学滤波检测边沿和角点
- OpenCV学习笔记(29)KAZE 算法原理与源码分析(三)特征检测与描述
- OpenCV for Ios 学习笔记(6)-标记检测3
- Opencv学习笔记(三)形态学之检测corners
- OpenCV学习笔记(三)人脸检测的代码分析(2)
- OpenCV for Ios 学习笔记(4)-标记检测1
- 基础学习笔记之opencv(21):一个简单有趣的皮肤检测代码
- OpenCV for Ios 学习笔记(5)-标记检测2
- 我的OpenCV学习笔记(19):检测轮廓,直线,圆以及直线拟合
- OpenCV for Ios 学习笔记(4)-标记检测1
- (学习笔记二)——基于opencv人脸检测原理及实现
- OpenCv学习笔记(八):角点检测
- 【OpenCV学习】运动检测实例
- 相机标记[置顶] OpenCV for Ios 学习笔记(6)-标记检测3