int main(){
//read image
string img1_path = "../data/img1.jpg";
string img2_path = "../data/img2.jpg";
cv::Mat img1 = cv::imread(img1_path);
cv::Mat img2 = cv::imread(img2_path);
//convert to gray
cv::Mat img1_gray, img2_gray;
cv::cvtColor(img1, img1_gray, cv::COLOR_BGR2GRAY);
cv::cvtColor(img2, img2_gray, cv::COLOR_BGR2GRAY);
//detect keypoints and descriptors
cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create();
std::vector<cv::KeyPoint> keypoints1, keypoints2;
cv::Mat descriptors1, descriptors2;
detector->detectAndCompute(img1_gray, cv::noArray(), keypoints1, descriptors1);
detector->detectAndCompute(img2_gray, cv::noArray(), keypoints2, descriptors2);
//matching
cv::BFMatcher matcher(cv::NORM_L2);
std::vector<cv::DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
//draw matches
cv::Mat img_matches;
cv::drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
cv::imshow("matches", img_matches);
cv::waitKey(0);
return 0;
}