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 位的灰度单通道图像。
- circles,调用 HoughCircles 函数后此参数存储了检测到的圆的输出矢量,每个矢量由包含了 3 个元素的浮点矢量(x,y,radius)表示。
- method,使用的检测方法,目前 OpenCV 中就霍夫梯度法一种可以使用,标识符为 HOUGH_GRADIENT。
- dp,累加面分辨率(大小) = 原始图像分辨率(大小) × 1/dp。默认 dp = 1 时,两者分辨率相同。
- minDist,两个圆心之间的最小距离。若两圆心距离 < minDist,则认为是同一个圆。
- param1,Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。
- param2,累加平面某点是否是圆心的判定阈值。它越大,能通过检测的圆就更接近完美的圆形,默认为 100。
- minRadius,圆半径的最小值。默认为 0。
- maxRadius,圆半径的最大值,默认为 0。
此函数可以很容易地检测出圆心,但是可能找不到合适地圆半径。我们可以通过 minRadius 和 maxRadius 两个参数指定最大和最小圆半径,来辅助圆检测的结果。或者可以直接忽略返回半径,让二者均为默认值,只用 HoughCircles 函数检测出圆心,用额外步骤进一步确定半径。
其代码如下图所示:
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
char input_win[] = "input image";
Mat src = imread("C:/opencv/data/coins.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
// convert to gray
Mat grayImg;
cvtColor(src, grayImg, CV_BGR2GRAY);
vectorcircles;
int hough_value = 80;
HoughCircles(grayImg, circles, HOUGH_GRADIENT, 1, 10, 110, hough_value, 10, 100);
Mat houghcircle = src.clone();
for (int i = 0; i < circles.size(); i++) {
circle(houghcircle, Point(circles[i][0], circles[i][1]), circles[i][2], Scalar(0, 0, 255), 2);
}
imwrite("houghcircle.jpg", houghcircle);
imshow("houghcircle", houghcircle);
waitKey(0);
return 0;
}
原图:
通过霍夫变换检测圆之后的图片如下图所示:
Original: https://blog.csdn.net/xuner1213/article/details/123694287
Author: runner000001
Title: Opencv霍夫变换圆检测实战之检测硬币(C++)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/702377/
转载文章受原作者版权保护。转载请注明原作者出处!