1.直线检测
对于直线y=mx+b中的一个点可以表示为可以避免m为无限或者不存在的情况
其中r是原点到直线上最近点的距离(其他人可能把这记录为ρ,下面也可以把r看成参数ρ,θ是x轴与连接原点和最近点直线之间的夹角。如图
笛卡尔坐标中围绕一个点的r与θ值是一个正弦函数
如何判断两个点在一条直线上,假设笛卡尔坐标中有两个点i与j,如果两点在一条直线则必然存在,
如果是三个点也是一样的情况,所以在霍夫空间中三条正弦曲线在同一个点相交,所有当有N个点时,如果相同的r,θ超过一定数目(阈值)的则可以判断这N个点在一条直线上
假设都在k点相交,那么这条直线的极坐标表达式为
例如取五个点计算不同角度下(θ为0°、45°、90°、135°、180°)的ρ值,45°时值一样
所以该直线的极坐标为
1.opencv的HoughLines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对 的集合来表示检测到的直线,其函数原型为:HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines
image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。
rho参数表示参数极径 以像素值为单位的分辨率,这里一般使用1像素。
theta参数表示参数极角 以弧度为单位的分辨率,这里使用1度。
threshold参数表示检测一条直线所需最少的曲线交点。
lines参数表示储存着检测到的直线的参数对 的容器 。
srn参数、stn参数默认都为0。如果srn = 0且stn = 0,则使用经典的Hough变换。
min_theta参数表示对于标准和多尺度Hough变换,检查线条的最小角度。
max_theta参数表示对于标准和多尺度Hough变换,检查线条的最大角度。
2.opencv的HoughLinesP函数是统计概率霍夫线变换函数,该函数能输出检测到的直线的端点 ,其函数原型为:HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines
image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。
rho参数表示参数极径 以像素值为单位的分辨率,这里一般使用 1 像素。
theta参数表示参数极角 以弧度为单位的分辨率,这里使用 1度。
threshold参数表示检测一条直线所需最少的曲线交点。
lines参数表示储存着检测到的直线的参数对 的容器,也就是线段两个端点的坐标。
minLineLength参数表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。
maxLineGap参数表示能被认为在一条直线上的亮点的最大距离。
2. 圆检测
笛卡尔坐标系中圆表达式为
转换到霍夫坐标中已,为例,可以做出,同理,,和,,可以做出两个圆,由于a, b ,r不确定所以是已,,,,和,为顶点的圆锥,假如这三个点在一个圆上,那个这三个圆锥必然相交与一个点这个点就是圆心,
OpenCV中提供的cvHoughCircle()函数里面可以设定半径r的取值范围,相当于有一个先验设定,在每一个r来说,在二维空间内寻找a和b就可以了,能够减少计算量。
x-y坐标系中一个圆形边界上有很多个点,对应到a-b坐标系中就会有很多个圆。由于原图像中这些点都在同一个圆形上,那么转换后a,b必定也满足a-b坐标系下的所有圆形的方程式。直观表现为这许多点对应的圆都会相交于一个点,那么这个交点就可能是圆心(a, b)