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

openCV学习笔记十二:霍夫变换

时间:2019-08-22 11:11:03来源:IT技术作者:seo实验室小编阅读:56次「手机版」
 

霍夫变换

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、电脑视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。

霍夫变换

1.标准霍夫变换-HoughLines()

2.累计概率霍夫变换-HoughLinesP()

3.霍夫圆变换-HoughCircles()

霍夫线变换是一种寻找直线的方法,首先将图像进行边缘检测处理,输入为边缘二值图。

OpenCV支持三种不同的霍夫线变换:

标准霍夫变换(SHT)------HoughLines()

多尺度霍夫变换(MSHT)------HoughLines()

累计概率霍夫变换(PPHT)------HoughLinesP()

HoughLines()函数参数详解:

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0, double min_theta=0, double max_theta=CV_PI )

1、image – 8-bit, single-channel binary source image. The image may be modified by the function.

输入的图像应该是8为单通道二值图像

2、lines—Output vector of lines.

输出的直线,lines代表的是一个容器,包含(\rho, \theta)的容器

3、rho – distance resolution of the accumulator in pixels.

极径参数的距离分辨率

4、theta – Angle resolution of the accumulator in radians.

极角参数的角度分辨率

5、threshold – Accumulator threshold parameter. Only those lines are returned that get enough votes (>\texttt{threshold} ).

设定的阈值,大于此阈值的交点,才会被认为是一条直线

HoughLinesP()函数参数详解

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

1、image – 8-bit, single-channel binary source image. The image may be modified by the function.

输入的图像应该是8为单通道二值图像

2、lines – Output vector of lines.

输出的矢量。输出的两点是线段的两个端点

3、rho – Distance resolution of the accumulator in pixels.

极径参数的距离分辨率

4、theta – Angle resolution of the accumulator in radians.

极角参数的角度分辨率

5、threshold – Accumulator threshold parameter. Only those lines are returned that get enough votes (>\texttt{threshold} ).

设定的阈值,大于此阈值的交点,才会被认为是一条直线

6、minLineLength – Minimum line length. Line segments shorter than that are rejected.

线段的最小长度

7、maxLineGap – Maximum allowed gap between points on the same line to link them.

点到直线被允许的最大距离

HoughCircles()函数参数详解

void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100,double param2=100, int minRadius=0, int maxRadius=0 )

第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的灰度单通道图像。

第二个参数,InputArray类型的circles,经过调用HoughCircles函数后此参数存储了检测到的圆的输出矢量,每个矢量由包含了3个元素的浮点矢量(x, y, radius)表示。

第三个参数,int类型的method,即使用的检测方法,目前OpenCV中就霍夫梯度法一种可以使用,它的标识符为CV_HOUGH_GRADIENT,在此参数处填这个标识符即可。

第四个参数,double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

第五个参数,double类型的minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。

第六个参数,double类型的param1,有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

第七个参数,double类型的param2,也有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

第八个参数,int类型的minRadius,有默认值0,表示圆半径的最小值。

第九个参数,int类型的maxRadius,也有默认值0,表示圆半径的最大值。需要注意的是,使用此函数可以很容易地检测出圆的圆心,但是它可能找不到合适的圆半径。

标准霍夫变换-HoughLines()

实例代码

int main(int argc, char** argv)

{

Mat src = imread(“3.JPG”, CV_LOAD_IMAGE_color);

Mat dstImg = src.clone();

imshow(“src”, src);

//霍夫变换是一种寻找直线的方法,一般在使用霍夫变换前首先将图像进行边缘检测处理,一般霍夫变换的输入为边缘二值图

cvtColor(src, src, CV_BGR2GRAY);

Mat cannyImg;

Canny(src, cannyImg, 50, 200, 3);

imshow(“Canny”, cannyImg);

vector lines; //定义矢量结构lines用于存放得到的线段矢量(ρ,θ)集合

HoughLines(cannyImg, lines, 1, CV_PI / 180, 150);

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

{

float rho = lines[i][0], theta = lines[i][1];

Point pt1, pt2;

double a = cos(theta), b = sin(theta);

double x0 = a rho, y0 = b rho;

pt1.x = cvRound(x0 + 1000 * (-b));

pt1.y = cvRound(y0 + 1000 * (a));

pt2.x = cvRound(x0 - 1000 * (-b));

pt2.y = cvRound(y0 - 1000 * (a));

line(dstImg, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);

}

imshow(“dst”, dstImg);

waitKey(0);

destroyAllwindows();

}

在这里插入图片描述

运行结果如下:

在这里插入图片描述

累计概率霍夫变换-HoughLinesP()

实例代码如下:

int main(int argc, char** argv)

{

Mat cannyImg;

Mat src = imread(“3.JPG”);

Mat dstImg = src.clone();

imshow(“src”, src);

cvtColor(src, src, CV_BGR2GRAY);

Canny(src, cannyImg, 50, 200, 3);

vector lines; //定义矢量结构lines用于存放得到的线段矢量(x_1,y_1,x_2,y_2)集合

HoughLinesP(cannyImg, lines, 1, CV_PI/180, 150, 50, 10);

//将线段画在目标图像上

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

{

Vec4i l = lines[i];

line(dstImg, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 0), 2, CV_AA);

}

imshow(“dst”, dstImg);

waitKey(0);

destroyAllWindows();

}

在这里插入图片描述

运行结果如下:

在这里插入图片描述

霍夫圆变换-HoughCircles()

实例代码如下:

int main(int argc, char** argv)

{ ///霍夫圆变换-HoughCircles()

Mat src = imread(“1.JPG”);

Mat dst = src.clone();

imshow(“src”, src);

cvtColor(src, src, CV_BGR2GRAY);

GaussianBlur(src, src, Size(9, 9), 2, 2);//不滤波会有非常非常多的误检圆

vector circles;//存放经霍夫变换后检测出的圆的输出矢量(x,y,radius)

HoughCircles(src, circles, CV_HOUGH_GRADIENT, 2, 30, 200, 100, 10, 200);

//将圆画在目标图像上

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

{

Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));

int radius = cvRound(circles[i][2]);

circle(dst, center, 3, Scalar(0, 0, 255), -1, 8, 0);

circle(dst, center, radius, Scalar(0, 255, 0), 3, 8, 0);

}

imshow(“dst”, dst);

waitKey(0);

}

在这里插入图片描述

运行结果如下:

在这里插入图片描述

相关阅读

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

一、霍夫直线变换:  opencv对应的API函数: HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int

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可以实现蒙版的功能,我们用几个实例来说明

分享到:

栏目导航

推荐阅读

热门阅读