一、代碼來源: https://github.com/drozdvadym/opencv_line_descriptor
二、依賴包:OpenCV 2.4.9
三、Matching的運行結果截圖:
四、代碼分析
代碼里重要的語句都有注釋,在這里只附上代碼,並做簡要補充。。
下面是LBD,LSD兩種方案的主要代碼

int main(void argc,const char **argv) { ... ... /* load image */ cv::Mat imageMat1 = imread( image_path1, 1 ); cv::Mat imageMat2 = imread( image_path2, 1 ); ... /* create binary masks */ //These will be used to when descript line. cv::Mat mask1 = Mat::ones( imageMat1.size(), CV_8UC1 ); cv::Mat mask2 = Mat::ones( imageMat2.size(), CV_8UC1 ); ... /* compute lines and descriptors */ std::vector<KeyLine> keylines1, keylines2; cv::Mat descr1, descr2; ( *bd )( imageMat1, mask1, keylines1, descr1, false, false ); ( *bd )( imageMat2, mask2, keylines2, descr2, false, false ); ... /* select keylines from first octave and their descriptors */ std::vector<KeyLine> lbd_octave1, lbd_octave2; Mat left_lbd, right_lbd; for ( int i = 0; i < (int) keylines1.size(); i++ ) { if( keylines1[i].octave == 0 ) { lbd_octave1.push_back( keylines1[i] ); left_lbd.push_back( descr1.row( i ) ); } } ... /* create a BinaryDescriptorMatcher object */ Ptr<BinaryDescriptorMatcher> bdm = BinaryDescriptorMatcher::createBinaryDescriptorMatcher(); /* require match */ std::vector<DMatch> matches; bdm->match( left_lbd, right_lbd, matches ); /* select best matches */ std::vector<DMatch> good_matches; for ( int i = 0; i < (int) matches.size(); i++ ) { if( matches[i].distance < MATCHES_DIST_THRESHOLD ) good_matches.push_back( matches[i] ); } ... //code for image show. }

... /* create an LSD detector */ Ptr<LSDDetector> lsd = LSDDetector::createLSDDetector(); /* detect lines */ std::vector<KeyLine> klsd1, klsd2; Mat lsd_descr1, lsd_descr2; lsd->detect( imageMat1, klsd1, 2, 2, mask1 ); lsd->detect( imageMat2, klsd2, 2, 2, mask2 ); /* compute descriptors for lines from first octave */ bd->compute( imageMat1, klsd1, lsd_descr1 ); bd->compute( imageMat2, klsd2, lsd_descr2 ); //select lines and descriptors ... /* compute matches */ std::vector<DMatch> lsd_matches; bdm->match( leftDEscr, rightDescr, lsd_matches ); //select best match ... //show image with lines feature. ...
由於matching.cpp里已包含線特征的提取,所以沒有單獨運行一下提取線特征的程序。
sample里其他程序的測試以后再添上去吧。