
#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>
namespace fs = std::filesystem;
using namespace cv;
using namespace std;
// 霍夫变换检测圆
void houghCircles()
{
cv::Mat src;
src = cv::imread("F:/opencv/console/x64/Debug/circle.png");
cv::imshow("input", src);
cv::Mat temp, gray, dst;
//cv::bitwise_not(src, src);
cv::medianBlur(src, temp, 3); // 中值滤波去除噪声
cv::cvtColor(temp, gray, cv::COLOR_BGR2GRAY); // 灰度化
// 霍夫圆检测
std::vector circles;
/*
参数说明:
cv::InputArray image:表示输入图像。
cv::OutputArray circles:圆的参数,包含圆心坐标和圆的半径。
int method:采用的检测方法,默认使用霍夫梯度法。
double dp:累加器分辨率与图像分辨率的反比。dp = 1表示累加器具有与输入图像相同的分辨率。
double minDist:标新两个圆心之间的最小距离。
double param1 = (100.0):表示边缘检测对应的参数。对于霍夫梯度法而言,表示为传递给canny边缘检测算子的高阈值,而低阈值则为高阈值的一半。
double param2 = (100.0):表示检测方法对应的参数。对于霍夫梯度法而言,表示在检测阶段圆心的累加器阈值。参数值越小就越可以检测出更多不存在的圆。
int minRadius = 0:表示半径的最小值。
int maxRadius = 0:表示半径的最大值。
*/
cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 10, 100, 100, 1, 100);
src.copyTo(dst);
for (size_t i = 0; i < circles.size(); i++) {
cv::Vec3f cc = circles[i]; // cc[0] -> x cc[1] -> y cc[2] -> r
cv::circle(dst, cv::Point(cc[0], cc[1]), cc[2], cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 可视化圆弧
cv::circle(dst, cv::Point(cc[0], cc[1]), 1, cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 可视化圆心
}
cv::imshow("output", dst);
}
int main()
{
// 霍夫变换检测圆
houghCircles();
waitKey(0);
destroyAllWindows();
return 0;
}