原matlab版来自于此链接
一、OpenCV 3.0只有基于边缘点梯度的霍夫圆变换函数:HoughCircles(),该函数精度不是很高,同实验室项目下与matlab的版本相差了十几个像素点,无法满足项目要求,故而用C++重写之,但项目紧迫,未进行优化,且只能返回霍夫空间中第一个最大累计值(accNum)的圆。
二、算法流程为:
1.使用大津阈值法计算阈值,供给OpenCV的canny函数使用,且低阈值系数设为与matlab相同的0.4;
2.仿造matlab版的参数列表,stepR、stepAngle、minR、maxR,但去除了p,因为只返回一个圆,所以相当于p设置为1;
3.申请成立霍夫空间,三维体积为:[图像高][图像宽][(maxR-minR)/stepR];(注意整数)
4.使用find函数查找边缘点坐标,并保存至点集容器,备用;
5.从点集容器中取点,以该点圆心,根据stepR和stepAngle的步长,在圆周内进行投票,即该位置(row,col,r)的霍夫空间+1;
6.找到霍夫空间内票数最多的位置,即为所求圆。
三、以下为原始代码,main函数位于最底部,可以根据自己的需求更改。
#include<opencv2\opencv.hpp>
#include<iostream>
#include &