1. 程式人生 > >Opencv學習——LSD直線檢測

Opencv學習——LSD直線檢測

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

LSD原理簡單介紹

LSD是一種區域性直線檢測方法,速度較快,LSD演算法通過對影象區域性分析,得出直線的畫素點集,再通過假設引數進行驗證求解,將畫素點集合與誤差控制集合合併,進而自適應控制誤檢的數量 。一般來說,要檢測影象中的直線,最基本的思想是檢測影象中梯度變化較大的畫素點集,LSD演算法也正是利用梯度資訊和行列線(level-line)來進行直線檢測的。詳細的LSD演算法原理及步驟參考以下博文:

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檔案新增到專案中,設定好影象的路徑,可以直接邊緣執行。

直線檢測結果

這裡寫圖片描述