#include<opencv2/opencv.hpp>
#include<iostream>
#include<opencv2/xfeatures2d.hpp>
#include<math.h>
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
int main()
{
Mat src = imread("F:/pictures/2.jpg");
Mat copy_src = src.clone();//保留原图,为后面绘图做准备
cvtColor(src, src, COLOR_BGR2GRAY);
Mat obj = imread("F:/pictures/3.jpg",0);
if (obj.empty())
{
cout << "could not load image" << endl;
return -1;
}
imshow("input1", src);
imshow("input2", obj);
Ptr<SURF> detectors = SURF::create(400);
vector<KeyPoint> keypoints_1,keypoints_2;
Mat descriptors_1, descriptors_2;
detectors->detectAndCompute(src, Mat(), keypoints_1, descriptors_1);
detectors->detectAndCompute(obj, Mat(), keypoints_2, descriptors_2);
FlannBasedMatcher matcher;
vector<DMatch> matchs;
matcher.match(descriptors_2, descriptors_1, matchs); //先是模板描述子,再到被检测图片描述子
//这里是没经选择好匹配的匹配 即直接匹配
Mat dst;
drawMatches(obj, keypoints_2, src, keypoints_1, matchs, dst); // 先是模板描图片,再到被检测图片
imshow("output", dst);
float min_val = 1000;
float max_val = 0;
vector<DMatch> goodamtchs;//好的匹配
cout << "descriptors_2.rows=" << descriptors_2.rows << " " << "descriptors_2.cols=" << descriptors_2.cols << endl;
cout << "matchs.size=" << matchs.size() << endl;
for (size_t i=0; i < descriptors_2.rows; i++)
{
float dis = matchs[i].distance;
if (dis > max_val)
{
max_val = dis;
}
if (dis < min_val)
{
min_val = dis;
}
}
for (size_t i = 0; i < descriptors_2.rows; i++)
{
float dis = matchs[i].distance;
if (dis <MAX(2 * min_val, 0.02))
{
goodamtchs.push_back(matchs[i]);
}
}
cout << "min_val=" << min_val << " " << "max_val=" << max_val << endl;
cout << "goodamtchs.size=" << goodamtchs.size() << endl;
Mat dst1;
drawMatches(obj, keypoints_2, src, keypoints_1, goodamtchs, dst1); // 先是模板描图片,再到被检测图片
imshow("output1", dst1);
vector<Point2f> pobj;
vector<Point2f> psrc;
for (size_t i = 0; i < goodamtchs.size(); i++)//把匹配的点放进去
{
pobj.push_back(keypoints_2[goodamtchs[i].queryIdx].pt);
psrc.push_back(keypoints_1[goodamtchs[i].trainIdx].pt);
}
/*Mat H;
findHomography(pobj, psrc, H);*/
Mat H = findHomography(pobj, psrc, RANSAC);
vector<Point2f> objs(4),srcs(4);
objs[0] = Point(0, 0);
objs[1] = Point(obj.cols, 0);
objs[2] = Point(obj.cols, obj.rows);
objs[3] = Point(0, obj.rows);
perspectiveTransform(objs, srcs, H);
line(copy_src, srcs[0], srcs[1], Scalar(0, 0, 255), 2, 8);
line(copy_src, srcs[1], srcs[2], Scalar(0, 0, 255), 2, 8);
line(copy_src, srcs[2], srcs[3], Scalar(0, 0, 255), 2, 8);
line(copy_src, srcs[3], srcs[0], Scalar(0, 0, 255), 2, 8);
imshow("final", copy_src);
waitKey(0);
return 0;
}
基于FLANN特征找匹配的演示代码
最新推荐文章于 2023-08-25 15:26:24 发布