opencv로 특징 "선"(line_features)을 추출해 보았다.

배경



OpenCV에서 유화 효과는 한 줄로 거는 것입니다. (C++ 한정) 처럼
Tutorials for contrib modules(opencv-contrib-python) 에서 최근에 작성된 모듈에서 비교적 빨리 확인할 수 있을 것 같은 것을 찾아서 구현하려고 합니다.
이번에는

특징 "선"추출

입니다.

특징점을 검출하는 수법은 AKAZE BRISK KAZE ORB SIFT SURF

개발. . . 했지만



Line Features Tutorial 에 있는 코드를 바탕으로 구현하려고 했습니다만,
cv::Ptr<cv::line_descriptor::LSDDetector> bd = cv::line_descriptor::LSDDetector::createLSDDetector();

에서 다음 오류가 발생했습니다.
Implementation has been removed due original code license issues in function 'LineSegmentDetectorImpl'
関数'LineSegmentDetectorImpl'内にあるオリジナルコードはライセンス問題が潜んでるため実装を削除したっす。

OpenCV에서 LineSegmentDetector (LSD)가 사라졌습니다. 이나 license problem in descriptor.hpp 을 보면 라이센스 문제로 4계에서 특징선을 추출하는 모듈이 삭제된 것 같습니다.

개발 (대체)



조사하면 createLSDDetector 대신 createFastLineDetector 를 사용할 수 있는 것 같습니다. 하지만 이미지를 비교하는 방법은 없습니다. 왜냐하면 detect 메소드에 DescriptorMatcher용의 출력 파라미터가 없기 때문입니다. LSDDetector 의 라이센스가 이후 프리가 되는지, FastLineDetector 전용의 비교 메소드가 나올 때까지 기다리거나, 각자로 최근 이웃 탐색당을 사용해 작성할 수 있을 것 같습니다.
( Descriptor Matchers 을 뭔가에서 사용하는 것일까 )

샘플 이미지는 또한 인스타에서 무작위로 선택되었습니다
htps //w w. Ins g et al. 이 m/p/B34P7로 BtSk/

원본 이미지


사용하는 라이브러리는 다음과 같습니다.
 -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_ximgproc
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/ximgproc/fast_line_detector.hpp>

int main( int argc, char** argv )
{
    //白黒画像(判定用)
    cv::Mat imageMat = cv::imread("./eiffeltower.png", cv::IMREAD_GRAYSCALE );
    //カラー画像(表示用)
    cv::Mat imageMat_color = cv::imread("./eiffeltower.png", cv::IMREAD_COLOR  );
    std::vector<cv::Vec4f> lines;

        //特徴線クラスオブジェクトを作成
    cv::Ptr<cv::ximgproc::FastLineDetector> fld =  cv::ximgproc::createFastLineDetector();

        //特徴線検索
    fld->detect( imageMat, lines);

    for (int i = 0; i < lines.size(); ++i) {
        //線の始点
        cv::Point pt1 = cv::Point2f( lines[i][0], lines[i][1] );
        //線の終点
        cv::Point pt2 = cv::Point2f( lines[i][2], lines[i][3] );
        cv::line( imageMat_color, pt1, pt2, cv::Scalar( 0, 0, 255 ), 2);
    }

    cv::namedWindow("line features", cv::WINDOW_AUTOSIZE);
    cv::imshow("line features", imageMat_color);

    cv::waitKey(0);

    cv::destroyAllWindows();
}

결과




메소드내에서는 Canny (세선화)를 이용하고 있다고 합니다만, 원 네타인 Outdoor Place Recognition in Urban Environments using Straight Lines 를 가치 읽지 않으면 모르겠습니다.

결론


createLSDDetector 를 사용하고 싶은 경우는 3계를 다운로드해 build 하면 사용할 수 있을지도 모릅니다만 환경을 정돈하는 것은 귀찮습니다. 이미지끼리의 비교입니다만 파라미터가 4개 밖에 없습니다만 최근 이웃 탐색으로 매칭할 수밖에 없을 것 같습니다. 공식 Doc에 있는데 Line Features Tutorial 을 사용할 수 없는 것이 진짜 잔디입니다. 이번에는 C++로 구현했지만 파이썬에서도 가능합니다. 시간이 있으면 추기합니다.

도움이 될 것 같은 링크


  • Lilian Zhang and Reinhard Koch. An efficient and robust line segment matching approach based on lbd descriptor and pairwise geometric consistency. Journal of Visual Communication and Image Representation, 24(7):794–805, 2013. 그렇지 않은 것 같습니다.
  • Outdoor Place Recognition in Urban Environments using Straight Lines
  • OpenCV에서 LineSegmentDetector (LSD)가 사라졌습니다.
  • license problem in descriptor.hpp
  • 좋은 웹페이지 즐겨찾기