Skip to content

Latest commit

 

History

History
76 lines (54 loc) · 4.28 KB

3.1.md

File metadata and controls

76 lines (54 loc) · 4.28 KB

3.1 霍尔变换检测直线和圆

霍尔变换,经典方法,对于检测圆形和直线感觉还是很有效果的。OpenCV Turtoial 里面有示例,此外查找了其他一些文章来补充几句。

函数说明:

霍尔变换的原理简单概括:转为极坐标中的曲线后,查看各条线的交点情况,如果交于一点的数量高于阈值,那么就找到一条直线。总之记住涉及到转为极坐标这一过程,所以后面的函数中都有 theta 参数,其实就是角度信息,默认都是 pi/180,即一度。

OpenCV 支持三种不同的霍夫线变换,它们分别是:标准霍夫变换(Standard Hough Transform,SHT),多尺度霍夫变换(Multi-Scale Hough Transform,MSHT),累计概率霍夫变换(Progressive Probabilistic Hough Transform ,PPHT)。

多尺度霍夫变换为标准霍夫变换在多尺度下的一个变种。累计概率霍夫变换是标准霍夫变换的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以名字中有概率,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性地减少计算时间。

总结一下,OpenCV中的霍夫线变换有如下三种:

  • 标准霍夫变换,由 HoughLines 函数调用。
  • 多尺度霍夫变换,由 HoughLines 函数调用。
  • 累计概率霍夫变换,由 HoughLinesP 函数调用。

此外还有一个霍尔变换检测圆形的方法:HoughCircles。

HoughLines

cv::HoughLines(
  InputArray src, OutputArray lines, 
  double rho, double theta, int threshold, 
  double srn=0, double stn=0, 
  double min_theta=0, double max_theta=CV_PI
)

标准霍夫变换或者多尺度霍夫变换来检测直线:

  • src:8UC1,通常是传入边缘检测、阈值处理后的图片
  • rho:生成极坐标时候的像素扫描步长,通常就是 1.0
  • theta:生成极坐标时候的角度步长,一般取值CV_PI/180,即表示一度
  • threshold:累加器的阈值,即上面霍夫变换中多少条曲线交于一点才会认为是直线,这个对结果有很大影响,可以先用 100 来试试效果
  • srn:是否应用多尺度的霍夫变换,0 表示经典霍夫变换,否则是多尺度,并且该参数表示距离分辨率的除数,粗略的累加器距离分辨率是参数rho,精确的累加器分辨率是rho/srn。
  • stn:是否应用多尺度的霍夫变换,0 表示经典霍夫变换,否则是多尺度,并且该参数表示角度分辨率的除数,粗略的累加器角度分辨率是参数theta,精确的累加器分辨率是theta/stn
  • min_theta, max_theta:检测直线的最小、最大角度

HoughLinesP

cv::HoughLinesP(
  InputArray src, OutputArray lines, 
  double rho, double theta, int threshold, 
  double minLineLength=0, double maxLineGap=0
)

累计概率霍夫变换,由 HoughLinesP 函数调用,大部分参数参考上面的函数:

  • minLineLength: 直线的最小长度,当检测直线的长度小于该数字时将被剔除
  • maxLineGap: 同一直线上相邻的两个点之间的最大距离,即允许将一条线上有些点可以有间隔,但不能超过这个参数

HoughLinesPointSet

cv::HoughLinesPointSet (
  InputArray point, OutputArray lines,
  int lines_max, int threshold,
  double min_rho, double max_rho, double rho_step,
  double min_theta, double max_theta, double theta_step 
)

官方文档有使用例子,在实际工程应用中,有可能得到的是一些点坐标,而不是一幅完整的图像,该函数就是能够在众多点中寻找是否存在直线的函数:

  • lines_max: 检测直线的最大数目
  • rho_step, min_rho, max_rho: 通常是 1, 0, 360 (这里就是转为极坐标的 rho 的取值范围)
  • theta_step, min_theta, max_thera: 通常是 CV_PI/180, 0, CV_PI/2 (这里就是转为极坐标的 theta 的取值范围)

HoughCircles

检测圆形,直接网上搜索资料或者去看文档吧