您的位置:首页 > 运维架构

【OpenCV】图像变换(四-2)霍夫变换圆检测

2015-04-27 15:12 239 查看
在上篇的博文中,我们重点讨论了霍夫变换的线段检测的数学原理,以及怎样在OpenCV中去实现线段的检测。在这篇博文中,关于圆的检测的数学理论,我们不做重点介绍。我们将简要介绍下OpenCV中自带的基于霍夫变换的圆检测函数cvHoughCircles()。

CvSeq* cvHoughCircles(
CvArr* image,//8位的图像,不过不需要是二值图像,可以是灰度图
void* circle_storage,//存储结果的存储器
int method,//这个参数必须设置为CV_HOUGH_GRADIENT
double dp,//累加器图像的分辨率,可设置为1或2,但是不能比1小
double min_dist,//让算法能明显区分的两个不同圆之间的最小距离
double param1=100,//边缘阈值
double param2=300,//累加器阈值
int min_radius=0,
int max_radius=0//发现圆半径的最小值和最大值
)


下面给出个程序的示例:

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;

int main()
{
const char *pSrcWindow = "原图";
const char *pDstWindow = "Hough圆检测图";

IplImage *pSrcImage = cvLoadImage("1.png", CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
//转化为灰度图
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
//构建个存储器,为后面的函数cvHoughCircles()传参
CvMemStorage *circle_storage = cvCreateMemStorage();
double min_dst = pGrayImage->height / 10;
//调用cvHoughCircles()函数,函数返回的是个序列
CvSeq* results = cvHoughCircles(pGrayImage, circle_storage, CV_HOUGH_GRADIENT, 1, min_dst);

IplImage *pColorImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3);
cvCvtColor(pGrayImage, pColorImage, CV_GRAY2BGR);
//将函数cvHoughCircles()检测得到的结果,遍历输出,并且画图
for (int i = 0; i < results->total; ++i)
{
float *p = (float*)cvGetSeqElem(results, i);
cvCircle(pColorImage, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 2);
}

cvNamedWindow(pSrcWindow, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pDstWindow, CV_WINDOW_AUTOSIZE);
cvShowImage(pSrcWindow, pSrcImage);
cvShowImage(pDstWindow, pColorImage);

cvWaitKey();

cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pColorImage);
cvReleaseMemStorage(&circle_storage);
cvDestroyWindow(pSrcWindow);
cvDestroyWindow(pDstWindow);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: