1. 程式人生 > >OpenCV——Brisk特征檢測、匹配與對象查找

OpenCV——Brisk特征檢測、匹配與對象查找

and 匹配 push_back osi distance lag sin http argc

技術分享圖片

技術分享圖片

檢測並繪制特征點:

 1 #include <opencv2/opencv.hpp>
 2 #include <opencv2/xfeatures2d.hpp>
 3 #include <iostream>
 4 
 5 using namespace cv;
 6 using namespace cv::xfeatures2d;
 7 using namespace std;
 8 
 9 int main(int argc, char** argv) {
10     Mat src = imread("test.jpg", IMREAD_GRAYSCALE);
11 if (src.empty()) { 12 printf("could not load image...\n"); 13 return -1; 14 } 15 namedWindow("input image", CV_WINDOW_AUTOSIZE); 16 imshow("input image", src); 17 18 // BRISK特征點檢測 19 Ptr<BRISK> detector = BRISK::create();//創建一個BRISK類對象並初始化 20 vector<KeyPoint> keypoints;
21 detector->detect(src, keypoints, Mat());//找出關鍵點 22 23 // 繪制關鍵點 24 Mat keypoint_img; 25 drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); 26 imshow("KeyPoints Image", keypoint_img); 27 28 waitKey(0); 29 return 0; 30 }

匹配:

 1 #include <opencv2/opencv.hpp>
 2
#include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 int main(int argc, char** argv) { 9 Mat img1 = imread("fire_5.jpg", IMREAD_GRAYSCALE); 10 Mat img2 = imread("數字.jpg", IMREAD_GRAYSCALE); 11 if (img1.empty() || img2.empty()) { 12 printf("could not load images...\n"); 13 return -1; 14 } 15 imshow("box image", img1); 16 imshow("scene image", img2); 17 18 19 // extract akaze features 20 Ptr<BRISK> detector = BRISK::create(); 21 vector<KeyPoint> keypoints_obj; 22 vector<KeyPoint> keypoints_scene; 23 Mat descriptor_obj, descriptor_scene; 24 detector->detectAndCompute(img1, Mat(), keypoints_obj, descriptor_obj); 25 detector->detectAndCompute(img2, Mat(), keypoints_scene, descriptor_scene); 26 27 28 // matching 29 FlannBasedMatcher matcher(new flann::LshIndexParams(20, 10, 2)); 30 //FlannBasedMatcher matcher; 31 //FlannBasedMatcher matcher; 32 vector<DMatch> matches; 33 matcher.match(descriptor_obj, descriptor_scene, matches); 34 35 // draw matches(key points) 36 Mat akazeMatchesImg; 37 /* 38 drawMatches(img1, keypoints_obj, img2, keypoints_scene, matches, akazeMatchesImg); 39 imshow("akaze match result", akazeMatchesImg);*/ 40 41 vector<DMatch> goodMatches; 42 double minDist = 100000, maxDist = 0; 43 for (int i = 0; i < descriptor_obj.rows; i++) { 44 double dist = matches[i].distance; 45 if (dist < minDist) { 46 minDist = dist; 47 } 48 if (dist > maxDist) { 49 maxDist = dist; 50 } 51 } 52 printf("min distance : %f", minDist); 53 54 for (int i = 0; i < descriptor_obj.rows; i++) { 55 double dist = matches[i].distance; 56 if (dist < max(1.5*minDist, 0.02)) { 57 goodMatches.push_back(matches[i]); 58 } 59 } 60 61 drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodMatches, akazeMatchesImg, Scalar::all(-1), 62 Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 63 imshow("good match result", akazeMatchesImg); 64 65 waitKey(0); 66 return 0; 67 }

OpenCV——Brisk特征檢測、匹配與對象查找