西安网站建设选任我行网络,wordpress 插件 打不开,什么是软文文案,移动应用开发代码OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)#xff0c;它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间#xff0c;来确定哪些像素符合圆形状。
1. 霍夫变换的原理
霍夫…OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间来确定哪些像素符合圆形状。
1. 霍夫变换的原理
霍夫变换的基本思想是将图像空间中的点映射到一个参数空间在这个参数空间中可以检测特定的几何形状如直线、圆等。对于圆形霍夫变换的目标是找到符合圆方程的像素。
圆的方程
在二维平面上圆可以由以下方程描述 其中
(a, b) 是圆心坐标r 是圆的半径(x, y) 是圆周上的一个点。 2. 霍夫圆检测的步骤
2.1 边缘检测
在进行霍夫变换之前首先对图像执行边缘检测通常使用 Canny 边缘检测器。边缘检测的目的是找到图像中的边缘像素因为这些像素更有可能属于圆周。
2.2 参数空间的投票 每一个在边缘图像中的像素点 (x, y)它可能属于多个不同圆的边界因此需要通过以下步骤将其投票映射到参数空间 将每个边缘像素映射为一组可能的圆心 (a, b)这些圆心位于距离该像素 r 的位置。通过改变半径 r 该像素 (x, y) 将投票给不同半径下的多个圆心。对于每个可能的半径 r 根据圆方程 其中 θ 是不同的角度值从 0 到 360 度遍历这些角度得到可能的圆心 (a, b)。 每个像素点对不同半径 r 和不同圆心 (a, b) 进行投票记录这些投票结果。
2.3 累加器
在参数空间 (a, b, r) 中有一个累加器用来统计哪些 (a, b, r) 的组合收到了最多的投票。最多投票的点表示在边缘图像中最可能的圆心和半径。累加器的最大值对应的是检测到的圆。
2.4 圆的确定
最后累加器中投票结果最多的那些 (a, b, r) 组合将被认为是图像中检测到的圆形。霍夫圆检测可以输出这些圆的圆心坐标 (a, b) 以及半径 r。
3. OpenCV 中霍夫圆检测的实现
OpenCV 中使用 HoughCircles() 函数来进行霍夫圆检测其主要参数包括
image输入的边缘检测图像通常是经过边缘检测或灰度化的图像。method霍夫变换的检测方法通常为 HOUGH_GRADIENT这是经典的霍夫圆检测方法。dp累加器分辨率的倒数。 dp1 表示累加器的分辨率与输入图像相同 dp2 表示累加器分辨率是输入图像的一半。minDist检测到的圆之间的最小距离防止检测到多个重叠的圆。param1用于边缘检测的 Canny 边缘检测的阈值。param2累加器的阈值值越高检测到的圆越少越准确。minRadius 和 maxRadius定义圆的最小和最大半径范围。
#include opencv2/opencv.hpp
//#include quickopencv.h
#include iostream
#include math.h
#include opencv2/imgproc.hpp
#include vectorusing namespace cv;
using namespace std;int main(int argc, char** argv) {Mat img imread(path_to_img.jpg);//QuickDemo qd;//qd.hough_circle(img);resize(img, img, Size(img.cols, img.rows), 0, 0, INTER_LINEAR);imshow(img, img);if (img.empty()) {cout 请确认图像文件名称是否正确 endl;return -1;}Mat gary;//将图像转换为灰度图cvtColor(img, gary, COLOR_BGR2GRAY);//高斯模糊//GaussianBlur(输入图像输出图像高斯核X轴上的标准差Y轴上的标准差);GaussianBlur(gary, gary, Size(9, 9), 2, 2);// 转换为二值图/*Mat binary;threshold(img, binary, 100, 255, cv::THRESH_BINARY);imshow(binary, binary);*///检测圆形vectorVec3f circles;double dp 1; //累加器分辨率与图像分辨率的反比如果dp1则累加器具有与输入图像相同的分辨率。如果dp2累加器的宽度和高度都是原来的一半。double minDist 10; //两个圆心的最小距离double param1 40; //Canny边缘检测的较大阈值double param2 40; //累加器阈值int min_radius 1; //圆形半径最小值int max_radius 50; //圆形半径最大值HoughCircles(gary, circles, HOUGH_GRADIENT, dp, minDist, param1, param2, min_radius, max_radius);//在图像中标记出圆形for (size_t i 0; i circles.size(); i) {//读取圆心Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));//读取半径int radius cvRound(circles[i][2]);//绘制圆心circle(img, center, 3, Scalar(0, 255, 0), -1, 8, 0);// 设置圆心坐标的文本std::string centerText ( std::to_string(center.x) , std::to_string(center.y) );// 计算文本框的大小cv::Size textSize cv::getTextSize(centerText, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, nullptr);// 计算文本框的左下角位置使其在圆心附近cv::Point textOrg((center.x - textSize.width / 2), (center.y textSize.height / 2));// 在圆心处绘制文本cv::putText(img, centerText, textOrg, cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 1);//绘制圆circle(img, center, radius, Scala
4. 霍夫圆检测的应用场景
霍夫圆检测广泛应用于多个场景包括但不限于
车轮、硬币等圆形物体检测医学图像中细胞、眼球、病变区域的圆形检测机器视觉中的工业零件检测。