介绍opencv中常见的霍夫变换

发布于:2021-09-21 04:38:06

霍夫变换是非常有用的,在大型项目的设计中都有着非常厉害的作用(比如农机,在田里检测直线,寻迹等)
霍夫变换包括霍夫线变换和霍夫圆变换,在许多场合中需要快速的检测出直线或者圆其中一种非常有效的方法就是霍夫变换,霍夫变换就是在黑白图像中检测直线。
1.霍夫变换是图像处理中的一种特征提取的技术,霍夫变换拓展到任意形状物体的识别,多为圆和椭圆,霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或者直线映射到另一个坐标空间的一个点上形成峰值,从而将检测任意形状的问题装换为统计峰值的问题,
2.霍夫曼线变换有三种,在霍夫曼线性变换之前首先要对图像进行边缘检测处理,既霍夫曼线变换的直接输入只能是边缘二值图像,霍夫变换分别是标准霍夫变换,多尺度霍夫变换,累计概率霍夫变换,在opencv中用HoughLines函数来调用标准霍夫变换和多尺度霍夫变换。
3.标准霍夫变换 HoughLines调用
4.多尺度霍夫变换 HoughLines调用
5.累计概率霍夫变换 HoughLinesP调用
检测到直线的时候从极坐标到直角坐标的变换
HoughLines函数可以找出采用霍夫变换的二值图像线条,C++:void HoughLines(InputArray image,OutputArray lines,double Rho,double,theta,int threshold,double srn=0,double stn=0)
1.第一个参数输入图像单通道二进制图像
2.检测到经过调用后存储了霍夫线变换输出的线条矢量,每一条线有由具有两个矢量表示,(r,theta),r表示离坐标原点的距图像的左上角坐标,theta表示弧度线条旋转角度{0-90}
3.double类型的rho,以像素为单位的精准距离,
4.double类型的theta,以弧度为角度为单位的角度精度,
5.int 类型的threshold累加*面的阈值参数既识别图像中某部分为图中的一条直线时它在累加*面中必须达到的值,大于阈值threshold的线段才可以被检测通过并返回到结果中。
6.对第三个参数精度的调整
7.double类型的stn,对于多尺度霍夫变换,srn表示第四个参数的进步尺寸的单位角度theta的除数距离,srn和stn同时为0表示使用经典的霍夫变换


二.累计概率霍夫变换
C++: void HoughLinesP(Inputrray image,OutputArrays lines,double rho,double theta,int threshold,double minLineLength=0,double maxLineGap=0)
1.image为原图像需要8位的单通道二进制图像。
2.lines经过调用HoughLinesP函数后存储了检测到的线条的输出矢量,每一条线由具有4个元素的矢量(x1,y1,x2,y2)来表示也就是两个二维点。
3.double类型的rho以像素为精度单位的距离精度。
4.double类型的theta,以弧度为单位的角度精度。另一种的表述方式是直线搜索
5.int类型的threshold,累加*面的阈值参数
6.表示最低线段长度
7.允许将同一行点与点之间连接起来的最大距离。


三.霍夫圆变换:
HoughCircle函数可以利用霍夫变换算法检测出灰度图中的圆,C++:void HoughCircles(I,O,int method,double dp,double minDist,double param1=100,double param2=200,int minRadius,int maxRadius)
1.输入图像,需要为8位单通道的灰度图像。
2.经过调用HoughCircles函数后此参数存储了检测到圆的输出矢量,每个矢量包括了3个元素的浮点矢量(x,y,radius)
3.所使用的检测方法目前就梯度法一种可以使用,HOUGH_GRADIENT
4.用来检测圆心的的累加器图像的分辨率于输入图像分辨率的倒数。
5.double类型的minDst,为霍夫变换检测到圆的圆心之间的最小距离,检测圆与圆
6.double类型的默认值100对应第三个参数中的数值
7.double对应第三个参数中的参数
8.表示圆半径的最小值
9.表示圆半径的最大值
此函数很容易检测出圆的圆心,
进行霍夫圆变换的过程:
vector circles;//这个圆是通过霍夫变换在二值或者灰度图片中提取出来的
HoughCircles(midImg,circles,HOUGH_GRADIEND,1.5,10,200,100,0,0);
for(size_t i=0;i{
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
int radius=cvRound(cvRound(circles[i][2]));
//绘制圆心
circle(srcImg,center,3,Scalar(0,0,255),-1,8,0);
circle(srcImg,center,radius,Scalar(0,0,255),-1,8,0);


}
霍夫变换的过程:
1.在二值图像中提取圆或者直线
2.把圆和直线在原图上标记出来就可以的。


在改变阈值的同时,可以动态的控制霍夫线变换检测到线条的多少

相关推荐

最新更新

猜你喜欢