cpp
#include<iostream>
#include<opencv.hpp>
using namespace std;
int main()
{
cv::Mat img = cv::imread("./cap_6_ROI.bmp");
/*cv::imshow("w", img);
cv::waitKey();*/
cv::Mat grayImage;
cv::cvtColor(img, grayImage, cv::COLOR_BGR2GRAY); // 将图像转换为灰度格式
std::vector<cv::Vec3f> circles;
cv::HoughCircles(grayImage, circles, cv::HOUGH_GRADIENT, 1, 50, 500, 50, 0, 0); // 检测圆
if (circles.size() != 1)
{
return -255;
}
for (size_t i = 0; i < circles.size(); i++) {
cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); // 计算圆心坐标
cout << center.x << ", " << center.y << endl;
int radius = cvRound(circles[i][2]); // 计算半径
cv::circle(img, center, radius, cv::Scalar(0, 255, 0), 2, cv::LINE_AA); // 绘制圆
cv::circle(img, center, 3, cv::Scalar(0, 0, 255), -1);// 圆心
}
cv::imshow("Circle Detection", img);
cv::waitKey(0);
return 0;
}
cv::HoughCircles
函数的各个参数的意义如下:
image:
输入图像,应为单通道8位或32位浮点类型。这是要在其中检测圆的图像。
circles:
输出向量,用于存储检测到的圆的信息。每个元素是一个三元组(x, y, radius)
,代表一个检测到的圆的圆心坐标(x, y)
和半径radius
。
method:
检测方法,应为CV_HOUGH_GRADIENT
。这是一种基于梯度的霍夫变换方法,用于检测圆。
dp:
累加器分辨率与图像分辨率之比的倒数。通常设置为1。较大的值会降低累加器的分辨率,从而提高检测速度,但可能会导致检测精度下降。
minDist:
检测到的圆之间的最小距离。如果两个圆的圆心距离小于该值,则只保留其中一个圆。
param1:
Canny边缘检测的高阈值。边缘强度高于该值的像素被认为是边缘点。
param2:
圆心投票阈值,应大于等于param1。只有在累加器中投票数超过该阈值的圆才被认为是检测到的圆。
minRadius:
检测到的圆的最小半径。小于该半径的圆将被忽略。
maxRadius:
检测到的圆的最大半径。大于该半径的圆将被忽略。
调整这些参数可以影响圆的检测结果。你可以根据图像的特点和需求来调整这些参数,以获得最佳的圆检测效果。