本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials
本篇使用的项目为:hough_circles
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
Mat src = imread("../sample/coins.jpg");
if (src.empty()) {
cout << "could not load image..." << endl;
return -1;
}
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(9, 9), 2, 2);
imshow("gray", gray);
vector<Vec3f> circles;
double minDist = 30;
double min_radius = 10;
double max_radius = 40;
HoughCircles(gray, circles, HOUGH_GRADIENT, 3, minDist, 100, 100, min_radius, max_radius);
for (size_t t = 0; t < circles.size(); t++) {
Point center(circles[t][0], circles[t][1]);
int radius = round(circles[t][2]);
// 显示
circle(src, center, radius, Scalar(0, 0, 255), 2, 8, 0);
drawMarker(src, center, Scalar(255, 0, 0), MARKER_TILTED_CROSS, 10, 2, 8);
}
imshow("hough circle demo", src);
waitKey(0);
destroyAllWindows();
return 0;
}
圆在平面坐标由三个参数决定:\(x_0,y_0,r\),代表圆心坐标和半径,参数方程描述为:
HoughCircles:霍夫圆检测
对噪声敏感,使用前需要降噪
void HoughCircles( InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0 );
- image:输入,8-bit单通道灰度图
- circles:输出,vector,含有3或4个元素
- x:圆形x坐标
- y:圆形y坐标
- radius:圆的半径
- votes
- method:检测方法
- HOUGH_STANDARD:标准霍夫变换
- HOUGH_PROBABILISTIC:基于概率的霍夫变换
- HOUGH_MULTI_SCALE:HOUGH_STANDARD的多尺度变种
- HOUGH_GRADIENT:霍夫梯度
- dp:累加器分辨率与图像分辨率的反比。例如,如果 dp=1 ,则累加器具有与输入图像相同的分辨率。 如果 dp=2 ,累加器的宽度和高度是原来的一半。dp大,更容易找到圆
- minDist:检测到的圆的中心之间的最小距离。如果参数太小,除了一个真一个之外,可能还会错误地检测到多个邻居圆。 如果太大,可能会遗漏一些圆圈。防止同心圆
- param1:如果检测方法为HOUGH_GRADIENT,代表Canny边缘提取的高阈值(低阈值比它小两倍)
- param2:如果检测方法为HOUGH_GRADIENT,代表检测圆心的累加器的阈值。越小检测的假圆越多
- minRadius:最小半径
- maxRadius:最大半径。如果 <= 0,则使用最大图像尺寸。 如果 < 0,则返回中心而不找到半径。
评论 (0)