opencv笔记二十二(霍夫变换检测圆)HoughCircles

核心步骤:中值滤波去噪声

hough圆检测原理:

https://blog.csdn.net/zhazhiqiang/article/details/51097439

opencv笔记二十二(霍夫变换检测圆)HoughCircles_第1张图片

因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤

波。 

 

基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:1. 检测边缘,发现可能的圆心 

2. 基于第一步的基础上从候选圆心开始计算最佳半径大小

 

API:

HoughCircles( InputArray image, // 输入图像 ,必须是8位的单通道灰度图像 

OutputArray circles, // 输出结果,发现的圆信息 (x, y, radius)

Int method, // 方法  CV_HOUGH_GRADIENT 

Double dp, // dp = 1; 用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,

                      //且此参数允许创建一个比输入图像分辨率低的累加器。

                      //例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。

                      //如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

Double mindist, // 10 最短距离-可以分辨是两个圆的,否则认为是同心圆。

                              //这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。

                              //反之,这个参数设置太大的话,某些圆就不能被检测出来了。

Double param1, // 它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

Double param2, //中心点累加器阈值 – 候选圆心。

                              //它越小的话,就可以检测到更多根本不存在的圆,

                              //而它越大的话,能通过检测的圆就更加接近完美的圆形了。

Int minradius, // 最小半径 

Int maxradius//最大半径 )

需要注意的是,使用此函数可以很容易地检测出圆的圆心,但是它可能找不到合适的圆半径

 

#include
#include
using namespace cv;
using namespace std;

RNG rng(123456);
int i = 1,j=255;
Mat t1, t2,t3,t4,t5,t6;
char *c = "TRY";
void TRY(int, void*);
int main(int agrc, char** agrv) {
	t1 = imread("houghc.png");
	if (!t1.data ) {
		cout << "WRONG";
		return -1;
	}
	cvtColor(t1, t2, CV_BGR2GRAY);
	threshold(t2, t3, 0, 255, THRESH_OTSU);
	medianBlur(t3, t3, 3);
	
	vector cir;
	HoughCircles(t3, cir, CV_HOUGH_GRADIENT, 1, 50, 100, 15, 20, 100);
	
	for (size_t i = 0; i < cir.size(); i++) {
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		circle(t1, Point(cir[i][0], cir[i][1]), cir[i][2], color, 1, 8);
	}
	namedWindow("t1", 0);
	imshow("t1", t1);
	waitKey(0);
}

 

你可能感兴趣的:(opencv,opencv+vs基础教程)