概念
HoughCircles函数
效果图对比
●源图像
●处理后图像
函数讲解
●函数原型
○c++
void HoughCircles( InputArray image, OutputArray circles,
int method, double dp, double minDist,
double param1 = 100, double param2 = 100,
int minRadius = 0, int maxRadius = 0 )
○Android
void HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)
●参数解释
○image:输入图像:8-bit,灰度图
○circles:输出圆的结果。
○method:定义检测图像中圆的方法。目前唯一实现的方法是HOUGH_GRADIENT。
○dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
○minDist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
○param1 :用于Canny的边缘阀值上限,下限被置为上限的一半。
○param2:HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多。
○minRadius :最小圆半径。
○maxRadius:最大圆半径。
注意
因为霍夫检测对噪声比较敏感,因此需要先对图像进行降噪处理,比如中值滤波。
函数使用
●c++中
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat src = imread("C:/Users/Administrator/Desktop/ic_houghcircle.jpg");//引入源图像
if (src.empty()) {
return -1;
}
imshow("src", src);//显示源图像
Mat mout;
medianBlur(src,mout,7);//中值滤波降噪
cvtColor(mout,mout,CV_BGR2GRAY);//转换为灰度图像
vector circles;//存储圆的容器
HoughCircles(mout,circles,HOUGH_GRADIENT,1,10,100,30,5,25);//进行霍夫圆检测
Scalar circleColor = Scalar(255,0,0);//圆形的边缘颜色
Scalar centerColor = Scalar(0, 0, 255);//圆心的颜色
for (int i = 0; i < circles.size(); i++) {
Vec3f c = circles[i];
circle(src, Point(c[0], c[1]),c[2], circleColor, 2, LINE_AA);//画边缘
circle(src, Point(c[0], c[1]), 2, centerColor, 2, LINE_AA);//画圆心
}
imshow("dst", src);//显示处理后的图像
waitKey(0);
return 0;
}
●Android中
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_relief);
Mat src = new Mat();
Mat blur = new Mat();
Utils.bitmapToMat(bitmap,src);//将Bitmap对象转换为Mat对象
Imgproc.medianBlur(src,blur,7);//中值滤波降噪
Mat circles = new Mat();//存储线的容器
Imgproc.HoughCircles(blur,circles,HOUGH_GRADIENT,1,10,100,30,5,25);//霍夫圆检测
for(int i = 0;i