下载对应版本的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 }