必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-08-17 23:14:32来源:IT技术作者:seo实验室小编阅读:75次「手机版」
 

霍夫变换

一、霍夫直线变换:

 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;
}

运行结果如下:

相关阅读

OpenCV:计时函数getTickCount、getTickFrequency

1. getTickCount() & getTickFrequency() getTickCount():返回CPU自某个时间以来走过的时钟周期数。getTickFrequency():返回CPU

Opencv图像识别从零到精通(35)---SURF

 SIFT在前面已经说过了,可以说在实现过程中是精益求精,用了各种手段来删除不符合条件的特征点,同时也得到了很好的效果但是实时性不

OpenCV学习笔记(8)image.copyTo()

OpenCV中image.copyTo()有两种形式:1、image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;2、image.copyTo(imageROI,mask),

OpenCV3之——copyTo()函数的使用方法

在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明

利用 OpenCV 和 Caffe,根据大合影构造“平均脸”

公司年会,大部门一起照了大合影。忽然有兴趣看看大家的平均脸是什么样子的,于是用 OpenCV 从大合影中提取出一千多名程序员的脸,构造

分享到:

栏目导航

推荐阅读

热门阅读