您的位置:首页 > 编程语言

【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的用法说明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息