下載對應版本的opencv-contrib
CMake編譯
如果有錯誤查看日志
打開日志文件,使用里面的地址從瀏覽器里面下載文件。
文件下載之后,放置在文件相應位置,並修改文件名。
進入Vs編譯
關於OpenCV4.0.1+contrib配置時運行程序出現“無法定位程序入口點”問題的解決辦法
解決方法
將…\opencv\opencv_contrib\x64\vc15\bin中的所有dll后綴文件拷貝到C:\Windows\System32中,問題解決。
或者放在以下位置也是可以的
測試代碼
1 #include <opencv2/opencv.hpp> 2 #include <opencv2/xfeatures2d.hpp> 3 //#include <opencv2/> 4 5 using namespace std; 6 using namespace cv; 7 8 int main() 9 { 10 cv::Mat imageL = cv::imread("origin_1.jpg"); 11 cv::Mat imageR = cv::imread("origin_2.jpg"); 12 /*imshow("1", imageL); 13 imshow("2", imageR); 14 waitKey(); 15 return 0;*/ 16 17 18 19 //提取特征點方法 20 //SIFT 21 cv::Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create(); 22 //ORB 23 //cv::Ptr<cv::ORB> orb = cv::ORB::create(); 24 //SURF 25 //cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(); 26 27 //特征點 28 std::vector<cv::KeyPoint> keyPointL, keyPointR; 29 //單獨提取特征點 30 sift->detect(imageL, keyPointL); 31 sift->detect(imageR, keyPointR); 32 33 //畫特征點 34 cv::Mat keyPointImageL; 35 cv::Mat keyPointImageR; 36 drawKeypoints(imageL, keyPointL, keyPointImageL, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 37 drawKeypoints(imageR, keyPointR, keyPointImageR, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 38 39 //顯示窗口 40 cv::namedWindow("KeyPoints of imageL", cv::WINDOW_AUTOSIZE); 41 cv::namedWindow("KeyPoints of imageR", cv::WINDOW_AUTOSIZE); 42 43 //顯示特征點 44 cv::imshow("KeyPoints of imageL", keyPointImageL); 45 cv::imshow("KeyPoints of imageR", keyPointImageR); 46 47 //特征點匹配 48 cv::Mat despL, despR; 49 //提取特征點並計算特征描述子 50 sift->detectAndCompute(imageL, cv::Mat(), keyPointL, despL); 51 sift->detectAndCompute(imageR, cv::Mat(), keyPointR, despR); 52 53 //Struct for DMatch: query descriptor index, train descriptor index, train image index and distance between descriptors. 54 //int queryIdx –>是測試圖像的特征點描述符( descriptor )的下標,同時也是描述符對應特征點(keypoint)的下標。 55 //int trainIdx –> 是樣本圖像的特征點描述符的下標,同樣也是相應的特征點的下標。 56 //int imgIdx –>當樣本是多張圖像的話有用。 57 //float distance –>代表這一對匹配的特征點描述符(本質是向量)的歐氏距離,數值越小也就說明兩個特征點越相像。 58 std::vector<cv::DMatch> matches; 59 60 //如果采用 flannBased 方法 那么 desp通過orb的到的類型不同需要先轉換類型 61 if (despL.type() != CV_32F || despR.type() != CV_32F) 62 { 63 despL.convertTo(despL, CV_32F); 64 despR.convertTo(despR, CV_32F); 65 } 66 67 cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased"); 68 matcher->match(despL, despR, matches); 69 70 //計算特征點距離的最大值 71 double maxDist = 0; 72 for (int i = 0; i < despL.rows; i++) 73 { 74 double dist = matches[i].distance; 75 if (dist > maxDist) 76 maxDist = dist; 77 } 78 79 //挑選好的匹配點 80 std::vector< cv::DMatch > good_matches; 81 for (int i = 0; i < despL.rows; i++) 82 { 83 if (matches[i].distance < 0.5 * maxDist) 84 { 85 good_matches.push_back(matches[i]); 86 } 87 } 88 89 90 91 cv::Mat imageOutput; 92 cv::drawMatches(imageL, keyPointL, imageR, keyPointR, good_matches, imageOutput); 93 94 cv::namedWindow("picture of matching", cv::WINDOW_AUTOSIZE); 95 cv::imshow("picture of matching", imageOutput); 96 cv::waitKey(0); 97 return 0; 98 }