第22课 霍夫变换——圆

1. 霍夫圆检测原理简介

  • 从平面坐标到极坐标转换三个参数:圆心坐标和半径。
  • 假设平面坐标的任意一个圆上的点C,转换到极坐标中,在点C处有最大值,霍夫变换正是利用这个原理实现圆的检测。
  • (a, b)为圆心坐标
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. 相关API

2.1.cv::HoughCircles()

  • 因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波,也可用高斯滤波,视噪声类型而定,具体可见图像模糊。
  • 基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:
    1. 检测边缘,发现可能的圆心
    2. 基于第一步的基础上从候选圆心开始计算最佳半径大小
HoughCircles(
InputArray image, // 输入图像 ,必须是8位的单通道灰度图像
OutputArray circles, // 输出结果,发现的圆信息
Int method, // 方法 - HOUGH_GRADIENT
Double dp, // 分辨率的反比,比例变换,保持不变设为1。
Double mindist, // 10 最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8
Double param1, // 内部Canny边缘检测器的上限阈值。
Double param2, // 中心点累加器阈值 – 候选圆心
Int minradius, // 最小半径
Int maxradius//最大半径 
)

在这里插入图片描述

3. 例程

#include <opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using  namespace std;

int main() {
	Mat dst, src;
	src = imread("D:/resource/images/圆检测.jpg");
	if (!src.data) printf("the image couldn't be loaded....");

	imshow("input", src);

	Mat Gray;
	cvtColor(src, Gray, COLOR_BGR2GRAY);
	Mat GBlurred;
	GaussianBlur(Gray, GBlurred, Size(3, 3), 0);

	vector<Vec3f> Circles;
	HoughCircles(GBlurred, Circles, HOUGH_GRADIENT, 1, 10, 100, 30, 15, 50);

	cvtColor(GBlurred, dst, COLOR_GRAY2BGR);

	for (size_t i = 0; i < Circles.size(); i++)
	{

		Vec3f c3 = Circles[i];
		//画圆
		circle(dst, Point(c3[0], c3[1]), c3[2], Scalar(0, 0, 255), 2, LINE_AA);
		//标注圆心
		circle(dst, Point(c3[0], c3[1]), 2, Scalar(0, 255, 255), 2, LINE_AA);
	}
	imshow("output", dst);

	waitKey(0);
	return 1;

}
发布了31 篇原创文章 · 获赞 12 · 访问量 2765

猜你喜欢

转载自blog.csdn.net/weixin_42877426/article/details/104297222