一.直线与极坐标的关系
直线:y = (- cosθ / sinθ) * x + (r / cosθ)
极坐标:r = x₁ * cosθ + y₁ * sinθ
每一个直角坐标系上的点对应一个极坐标方程,将这个点映射到由 r–θ表示的霍夫空间,每个点对应一条曲线,在霍夫空间中当多条曲线相交于一点(r, θ)时,说明直角坐标系上的这些点都经过了由(r, θ)所表示的这条直线,所以属于同一条直线上的点,会在极坐标中某一点有最强的信号(亮度)
二.霍夫直线检测API
1.标准的霍夫直线检测:输出的是(r, θ)
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 );
参数image:二值图
参数lines:输出的极坐标来表示直线,每条直线用数组里面的两个元素(r, θ)表示。vector<Vec2f >
参数rho:生成极坐标时像素的扫描步长
参数theta:生成极坐标时角度的扫描步长,一般设置为1度:CV_PI / 180
参数threshold:阈值,只有极坐标交点获得足够的次数才能代表直线
参数srn,stn:srn,stn = 0,使用经典霍夫变换;srn,stn为正数则使用多尺度霍夫变换,扫描步长变为rho/srn,扫描角度步长变为theta / stn。(多尺度的步长精度更细)
参数min_theta,max_theta:设置的检测最小和最大角度
2.最常用的累计概率霍夫直线检测:输出的是(x0,y0,x1,y1)
void HoughLinesP( InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double minLineLength = 0, double maxLineGap = 0 );
参数image:二值图
参数lines:vector<Vec4f>
每条直线包含4个元素
参数rho:生成直角坐标时像素的扫描步长
参数theta:生成直角坐标时角度的扫描步长,一般设置为1度:CV_PI / 180
参数threshold:阈值,只有极坐标交点获得足够的次数才能代表直线
参数minLineLength:最小的直线长度(比如将长度小于5的不看做直线)
参数maxLineGap:两条直线之间最大距离(比如将间隔小于5的两条直线看做一条直线)