#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <opencv2\xfeatures2d.hpp>
#include <iostream>
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
int main()
{
Mat img1 = imread("C:\\Users\\administered\\Pictures\\template2.png", IMREAD_GRAYSCALE);
Mat img2 = imread("C:\\Users\\administered\\Pictures\\target.jpg", IMREAD_GRAYSCALE);
if (!img1.data || !img1.data)
{
printf("could not load image...\n");
return -1;
}
imshow("bag1 image", img1);
imshow("bag2 image", img2);
int minHessian = 10;
Ptr<SURF> detector = SURF::create(minHessian);
vector<KeyPoint> keypoints_bag1;
vector<KeyPoint> keypoints_bag2;
Mat descriptor_bag1, descriptor_bag2;
detector->detectAndCompute(img1, Mat(), keypoints_bag1, descriptor_bag1);
detector->detectAndCompute(img2, Mat(), keypoints_bag2, descriptor_bag2);
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptor_bag1, descriptor_bag2, matches);
double minDist = 400.0;
double maxDist = 0.0;
for (int i = 0; i < descriptor_bag1.rows; i++)
{
double dist = matches[i].distance;
if (dist > maxDist)
{
maxDist = dist;
}
if (dist < minDist)
{
minDist = dist;
}
}
printf("max distance: %f\n", maxDist);
printf("min distance: %f\n", minDist);
double sect = maxDist - minDist;
vector<DMatch> goodMatches;
for (int i = 0; i < descriptor_bag1.rows; i++)
{
double dist = matches[i].distance;
if (dist < (minDist+0.1*sect))
{
goodMatches.push_back(matches[i]);
}
}
Mat matchesImg;
drawMatches(img1, keypoints_bag1, img2, keypoints_bag2, goodMatches, matchesImg, Scalar::all(-1),
Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow("Flann Matching Result", matchesImg);
waitKey(0);
return 0;
}
opencv 特征匹配
最新推荐文章于 2025-02-13 21:54:23 发布