OpenCV3版本之后加入了LSD直线检测功能,相比Hough直线检测,LSD能够获得更加理想的效果,具体可以参考文献的主页,包括了文献、代码和演示效果。
LSD原理简单介绍
LSD是一种局部直线检测方法,速度较快,LSD算法通过对图像局部分析,得出直线的像素点集,再通过假设参数进行验证求解,将像素点集合与误差控制集合合并,进而自适应控制误检的数量 。一般来说,要检测图像中的直线,最基本的思想是检测图像中梯度变化较大的像素点集,LSD算法也正是利用梯度信息和行列线(level-line)来进行直线检测的。详细的LSD算法原理及步骤参考以下博文:
http://blog.csdn.net/lien0906/article/details/38417191
http://blog.csdn.net/tianwaifeimao/article/details/17678669
OpenCV-LSD直线检测
具体代码如下:
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
bool useRefine = true;
bool useCanny = true;
Mat image = imread("image_0.png", IMREAD_GRAYSCALE);
if( image.empty() )
{
cout << "Unable to load Image" << endl;
return 1;
}
imshow("Source Image", image);
if (useCanny)
Canny(image, image, 50, 200, 3);
Ptr<LineSegmentDetector> ls = useRefine ? createLineSegmentDetector(LSD_REFINE_STD) : createLineSegmentDetector(LSD_REFINE_NONE);
vector<Vec4f> lines_std;
ls->detect(image, lines_std);
// Show found lines
if (useCanny)
image = Scalar(0, 0, 255);
ls->drawSegments(image, lines_std);
imshow("result", image);
waitKey();
return 0;
}
文献作者也提供了源码,为了方便使用,结合OpenCV实现图像的LSD直线检测,具体代码可以从如下地址下载:
下载后将头文件以及c和cpp文件添加到项目中,设置好图像的路径,可以直接边缘运行。