opencv学习笔记十五:霍夫变换

一、霍夫直线变换:

 opencv对应的API函数:

HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold,double minLineLength=0, double maxLineGap=0 )

参数解释:

image: 边缘检测后的图像;

lines: 储存着检测到的直线的参数对的四维数组vector<Vec4f>,分别为起始点和终止点的x,y坐标;

rho : 生成极坐标时的像素扫描步长,一般取值1;

theta: 生成极坐标时的角度步长, 一般取值1度 (即CV_PI/180);

threshold: 检测到直线中所需最少的的曲线交点 ;

minLinLength: 最小直线长度,舍弃长度低于该值的直线;

maxLineGap:最大间隔,即直线之间间隔在该值以内进行合并。

#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;
int main(int arc, char** argv)
{   
	Mat src, gray_img,canny_img;
	src = imread("1.jpg");
	namedWindow("input",CV_WINDOW_AUTOSIZE);
	imshow("input", src);
	
	cvtColor(src, gray_img, CV_BGR2GRAY);
	Canny(gray_img, canny_img, 100, 200);
	vector<Vec4i> plines;
	Scalar color = Scalar(255, 255, 255);//因为是在灰度图像上画,所以要为灰度值
    //霍夫直线检测
	HoughLinesP(canny_img, plines, 1, CV_PI / 180.0, 10,0,10); 
	for (int i = 0; i < plines.size(); i++) {
		Vec4i hline = plines[i];
		line(canny_img, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3,8);
	}
	imshow("output", canny_img);
	waitKey(0);
	return 0;
}

运行结果如下:

二、霍夫圆变换

首先确定半径的区间,依次指定一半径,\theta从0到360度变换,每一个像素点则可以得到一个关于a,b的曲线,遍历边缘检测后的像素,对于一指定r,找到所有曲线交点最多的点,该交点即为圆心坐标,圆心半径都有了,圆即找到了。

 opencv对应的API函数:

HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double param1, double param2,int minRadius, int maxRadius);
                               
                              

参数解释:

image:输入图像矩阵,要求是灰度图像;

circles:储存着检测到的圆的参数对的三维数组vector<Vec3f>,分别为圆心坐标和圆的半径;

method:canny边缘检测方法( CV_HOUGH_GRADIENT);

dp:金字塔层数;

minDist:两个圆心之间的最小距离;

param1:是Canny边缘检测的低阈值,高阈值被自动置为低阈值的两倍;

param2:中心点累加器阈值(候选圆心);

minRadius:最小半径;

maxRadius:最大半径。

#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;
int main(int arc, char** argv)
{   
	Mat src,dst, gray_img, blur_img;
	src = imread("2.jpg");
	namedWindow("input",CV_WINDOW_AUTOSIZE);
	imshow("input", src);
	
	cvtColor(src, gray_img, CV_BGR2GRAY);
	medianBlur(gray_img, blur_img, 3);
	vector<Vec3f> pcircles;

    //霍夫圆检测
	HoughCircles(blur_img, pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);
	src.copyTo(dst);
	for (int j = 0; j < pcircles.size(); j++) {
		Vec3f pcircle = pcircles[j];
		circle(dst, Point(pcircle[0], pcircle[1]), pcircle[2], Scalar(0, 0, 255), 2);
		circle(dst, Point(pcircle[0], pcircle[1]), 2, Scalar(0, 255, 0), 2);
	}
	imshow("output2", dst);
	waitKey(0);
	return 0;
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82462314
今日推荐