基于FLANN特征找匹配的演示代码

#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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值