欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv_22 霍夫圆检测

程序员文章站 2022-07-14 11:18:32
...

霍夫圆检测原理

opencv_22 霍夫圆检测
//确定一个圆,只需确定其圆心位置及其半径位置。
//霍夫圆检测是已知圆上的像素点,以及半径。通过每个点以及半径在霍夫空间形成不同的圆,这些圆的交点就是已知圆的圆心。
//找到圆心后,在已知半径的情况下可以在霍夫空间(极坐标)得到该圆。
opencv_22 霍夫圆检测
opencv_22 霍夫圆检测
####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);

opencv_22 霍夫圆检测
//注意使用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;
}