1.主要内容

  • 霍夫圆检测原理
  • 相关API
  • 代码演示

2.霍夫圆检测原理

  • 从平面坐标到极坐标转换三个参数C(x0,y0,r),其中x0.y0是圆心。
  • 假设平面坐标的任意一个圆上的点,转换到极坐标中,C(x0,y0,r)处有最大值,霍夫变换正是利用这个原理实现圆的检测
  • 因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波(去椒盐噪声)
  • 基于效率考虑,opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:
    • 第一步:检测边缘,发现可能的圆心
    • 第二步:基于第一步的基础上从候选圆心开始计算最佳半径。
      在这里插入图片描述
      在这里插入图片描述

3.相关API cv::HoughCricles

HoughCricles(
    InputArray  image,//输入图像,必须是8为的单通道灰度信息
    OutputArray circles,//输出结果,发现的圆信息(一个向量数组vector)
    Int methon,//方法——HOUGH_GRADIENT
    Double dp,//dp=1,原图上寻找为1,在原图宽高个小一半为2
    Double mindist,//10最短距离——可以是分辨两个圆的,否则认为是同心圆——src_gray.rows/8
    Double param1,//canny edge detection low threshold,(canny检测低阈值)
    Double param2,//中心点累加器阈值——候选圆心,一般30.50差不多了
    Int minradius,//最小半径
   Int maxradius  //最大半径
)

4.演示代码

cvtColor(src,src,CV_BGR2GRAY)medianBlur(src,dst,Size(5,5),0,0);
//霍夫圆检测
vector<Vec3f>circles;//将我们霍夫变换得到的结果存放到这个数据中
HonghCircles(dst,circles,HOUGH_GRADIENT,1,10,100,30,5,50);//输出的是圆的信息
//重新转回RGB彩色空间
cvtColor(dst,dst,CV_GRAY2BGR);
src.copyTo(dst);
for(size_t i = 0;i < circles.size();i++){
    Vec3f  c3 = circles[i];
   cricle(dst,point(c3[0],c3[1]),point(c3[2],c3[3]),Scalar(0,0,255),3,LINE_AA)
}  
imshow("输出图像",dst);

在对各类API调用时,我们要根据自己的知识体系对图像进行适当的预处理来帮助我们获得更高的效率。

5.medianBlur函数(中值滤波)

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
InputArray src: 
    输入图像,图像为134通道的图像,当模板尺寸为35时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。 
OutputArray dst:
    输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst 
int ksize: 
    滤波模板的尺寸大小,必须是大于1的奇数,如357……       

6.circles函数

void circle(
Mat  img,//img为源图像
Point center, //center为画圆的圆心坐标
int radius,//radius为圆的半径
Scalar color, //color为设定圆的颜色,规则根据B(蓝)G(绿)R(红)
int thickness=1,//thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
int lineType=8, //line_type 线条的类型。默认是8
int shift=0//shift 圆心坐标点和半径值的小数点位数
)

7.课外扩展

opencv中常用的非线性滤波器–中值滤波medianBlur() 和 双边滤波bilateralFilter()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐