LSD快速直线检测的原理概要及OpenCV代码实现(CV类LineSegmentDetector)

本文参考了《OpenCV图像处理编程实例》

LSD快速直线检测算法是由Rafael Grompone、Jeremie Jackbowicz、Jean-Michel Morel于2010年发表在PAMI上的文献《LSD:a Line Segment Dectctor》中提出的,该算法时间复杂度较霍夫变换低。LSD算法通过对图像局部分析,得出直线的像素点集,再通过假设参数进行验证求解,将像素点集合与误差控制集合合并,进而自适应控制误检的数量 。一般来说,要检测图像中的直线,最基本的思想是检测图像中梯度变化较大的像素点集,LSD算法也正是利用梯度信息和行列线(level-line)来进行直线检测的。

关于LSD快速直线检测算法的原理,可以参考博文http://blog.csdn.net/polly_yang/article/details/10085401

关于LSD快速直线检测算法的算法实现和相关代码,可以参考下面两篇博文:

http://blog.csdn.net/tianwaifeimao/article/details/17678669

http://blog.csdn.net/lonelyrains/article/details/49493053

原理就讲到这里,下面上代码(请大家注意:3.0.0以上的OpenCV才可以通过编译

代码中用到的图像的下载链接为:http://pan.baidu.com/s/1bQ2izc

//OpenCV版本3.0.0 
//交流QQ2487872782 

2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!  

代码说明

LineSegmentDetector是一个类,这个类用于实现LSD算法!代码中用到的两个成员函数如下:

cv::LineSegmentDetector::detect();对输入图像进行线检测;

cv::LineSegmentDetector::drawSegments() :将检测到的线绘制出来

createLineSegmentDetector这个函数返回一个LineSegmentDetector类的对象的指针~它的原型如下:

Ptr<LineSegmentDetector> createLineSegmentDetector(int _refine = LSD_REFINE_STD, double _scale = 0.8,double _sigma_scale = 0.6, double _quant = 2.0, double _ang_th = 22.5,double _log_eps = 0, double _density_th = 0.7, int _n_bins = 1024);

可见,这个函数很像类的构造函数,它里边已经有缺省的初始化参数了。这里说明下int _refine的几个宏定义参数的含义:

LSD_REFINE_NONE = 0, //!< No refinement applied
LSD_REFINE_STD  = 1, //!< Standard refinement is applied. E.g. breaking arches into smaller straighter line approximations.

 LSD_REFINE_ADV  = 2  //!< Advanced refinement. Number of false alarms is calculated, lines are refined through increase of precision, decrement in size, etc.

运行结果如下图所示


个人感觉这个结果要优于Hough(霍夫检测)的结果,如果要对比,请点链接http://blog.csdn.net/wenhao_ir/article/details/51774444

-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782

你可能感兴趣的:(LSD快速直线检测的原理概要及OpenCV代码实现(CV类LineSegmentDetector))