opencv_22 霍夫圆检测
程序员文章站
2022-07-14 11:18:32
...
霍夫圆检测原理
//确定一个圆,只需确定其圆心位置及其半径位置。
//霍夫圆检测是已知圆上的像素点,以及半径。通过每个点以及半径在霍夫空间形成不同的圆,这些圆的交点就是已知圆的圆心。
//找到圆心后,在已知半径的情况下可以在霍夫空间(极坐标)得到该圆。
####API:HoughCircle()
//霍夫变换对噪声敏感,通常需要中值滤波消除椒盐噪声
//opencv中实现霍夫变换不是固定半径R,圆检测的过程:
1.canny算子检测边缘,对图像求梯度,发现候选圆心
2.设置半径范围,对候选圆心计算最佳半径R
HoughCircles(
输入图像,(8位灰度图)
输出结果,//候选圆的信息(三维向量,圆心坐标及半径)
求梯度//可能得到的边缘值
图像金字塔,//图像尺度
两个候选圆心的距离//判断是否为同心圆
canny边缘检测低阈值,
canny边缘检测高阈值,//中心圆累加器
最小半径,
最大半径,
)
//介绍一下这个canny高低阈值
1.先对图像进行x,y方向上的梯度计算,然后平方和开根号,或x,y方向梯度绝对值相加的到像素的幅度
2.若像素的幅度高于高阈值则保留,低于低阈值则删除。幅度值在高低阈值之间,与高于高阈值的像素相连即保留。
//通过for循环遍历候选圆,在三维数组中取到候选圆的半径圆心坐标(数组寻址的方式)
for (size_t i = 0; i < pcircles.size(); i++)
{
//找到候选圆
Vec3f cc = pcircles[i];
circle(output, Point(cc[0], cc[1]), cc[2],Scalar(0,0,255), 1);
//标记圆心
circle(output, Point(cc[0], cc[1]), 2, Scalar(255, 0, 255), 2);
}
imshow("hf", output);
//注意使用vector<>要引用头文件"#include"。。以及命名空间 using namespace std;
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("C:\\Users\\Administrator\\Pictures\\Saved Pictures\\timg6ZAGKYHR.jpg");
if (src.empty())
{
printf("ould not find image \n");
return -1;
}
namedWindow("opencv set up demo", WINDOW_AUTOSIZE);
imshow("opencv set up demo", src);
//图像去噪
Mat dst, gray,output;
medianBlur(src, dst, 3);
cvtColor(dst, gray, COLOR_BGR2GRAY);
//霍夫圆检测
vector <Vec3f> pcircles;//候选圆
HoughCircles(gray, pcircles, HOUGH_GRADIENT, 1, 10, 100,30, 5, 50);
src.copyTo(output);
for (size_t i = 0; i < pcircles.size(); i++)
{
//找到候选圆
Vec3f cc = pcircles[i];
circle(output, Point(cc[0], cc[1]), cc[2],Scalar(0,0,255), 1);
//标记圆心
circle(output, Point(cc[0], cc[1]), 2, Scalar(255, 0, 255), 2);
}
imshow("hf", output);
waitKey(0);
return 1;
}
上一篇: opencv之霍夫变换圆检测
下一篇: opencv20-霍夫圆检测