Opencv學習——LSD直線檢測

OpenCV3版本之後加入了LSD直線檢測功能,相比Hough直線檢測,LSD能夠獲得更加理想的效果,具體可以參考文獻的主頁,包括了文獻、代碼和演示效果。

http://www.ipol.im/pub/art/2012/gjmr-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直線檢測,具體代碼可以從如下地址下載:

http://download.csdn.net/download/dangkie/10197261

下載後將頭文件以及c和cpp文件添加到項目中,設置好圖像的路徑,可以直接邊緣運行。

直線檢測結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章