opencv3/C++ FLANN特征匹配方式
作者:阿卡蒂奥 发布时间:2021-08-19 10:17:47
标签:opencv3,FLANN,特征匹配
使用函数detectAndCompute()检测关键点并计算描述符
函数detectAndCompute()参数说明:
void detectAndCompute(
InputArray image, //图像
InputArray mask, //掩模
CV_OUT std::vector<KeyPoint>& keypoints,//输出关键点的集合
OutputArray descriptors,//计算描述符(descriptors[i]是为keypoints[i]的计算描述符)
bool useProvidedKeypoints=false //使用提供的关键点
);
match()从查询集中查找每个描述符的最佳匹配。
参数说明:
void match(
InputArray queryDescriptors, //查询描述符集
InputArray trainDescriptors, //训练描述符集合
CV_OUT std::vector<DMatch>& matches, //匹配
InputArray mask=noArray() //指定输入查询和描述符的列表矩阵之间的允许匹配的掩码
) const;
FLANN特征匹配示例:
#include<opencv2/opencv.hpp>
#include<opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace cv::xfeatures2d;
//FLANN对高维数据较快
int main()
{
Mat src1,src2;
src1 = imread("E:/image/image/card2.jpg");
src2 = imread("E:/image/image/cards.jpg");
if (src1.empty() || src2.empty())
{
printf("can ont load images....\n");
return -1;
}
imshow("image1", src1);
imshow("image2", src2);
int minHessian = 400;
//选择SURF特征
Ptr<SURF>detector = SURF::create(minHessian);
std::vector<KeyPoint>keypoints1;
std::vector<KeyPoint>keypoints2;
Mat descriptor1, descriptor2;
//检测关键点并计算描述符
detector->detectAndCompute(src1, Mat(), keypoints1, descriptor1);
detector->detectAndCompute(src2, Mat(), keypoints2, descriptor2);
//基于Flann的描述符匹配器
FlannBasedMatcher matcher;
std::vector<DMatch>matches;
//从查询集中查找每个描述符的最佳匹配
matcher.match(descriptor1, descriptor2, matches);
double minDist = 1000;
double maxDist = 0;
for (int i = 0; i < descriptor1.rows; i++)
{
double dist = matches[i].distance;
printf("%f \n", dist);
if (dist > maxDist)
{
maxDist = dist;
}
if (dist < minDist)
{
minDist = dist;
}
}
//DMatch类用于匹配关键点描述符的
std::vector<DMatch>goodMatches;
for (int i = 0; i < descriptor1.rows; i++)
{
double dist = matches[i].distance;
if (dist < max(2.5*minDist, 0.02))
{
goodMatches.push_back(matches[i]);
}
}
Mat matchesImg;
drawMatches(src1, keypoints1, src2, keypoints2, goodMatches, matchesImg, Scalar::all(-1), Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow("output", matchesImg);
waitKey();
return 0;
}
来源:https://blog.csdn.net/akadiao/article/details/79163727


猜你喜欢
- 最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下欢迎交流和加入新的内容用到了JSwing,下面是一些具体的思路实现&
- 前言哎呀,妈呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了
- 跨域跨域请求是指浏览器脚本文件在发送请求时,脚本所在的服务器和请求的服务器地址不一样。跨域是有浏览器的同源策略造成的,是浏览器对JavaSc
- Java BufferWriter写文件之后文件是空的或者数据不全在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集
- 最近开发过过成中遇到一些小问题,比如一个btn点击用户可能只点击了一次但是后台响应了多次,像一些表单的提交出现这种问题比较棘手,当然解决这种
- 扫雷游戏,大家都应该玩过吧!其实规则也很简单,可是我们想自己实现一个扫雷,我们应该怎么做呢?Step1: 知晓游戏原理扫雷就是要把所有非地雷
- 从何说起前些天和朋友讨论一个问题,他们的应用有几十万会员然后对应有积分,现在想做积分排名的需求,问有没有什么好方案。这个问题也算常见,很多地
- 本文实例讲述了C#针对xml文件转化Dictionary的方法。分享给大家供大家参考。具体实现方法如下:下面是xml文件:<?xml
- 本文实例分析了Android中ImageView用法。分享给大家供大家参考,具体如下:猜牌游戏大家可能以前都玩过,这里我们用这个小游戏来说明
- 静态方法代理:public delegate void DoGreeting(string name);class Program 
- 使用filter对response内容进行加密编写加密类(AES)/** * aes加密解密 */public class AesEncry
- 本文实例为大家分享了Unity实现物体左右移动效果的具体代码,供大家参考,具体内容如下效果如下代码:using UnityEngine;us
- 作为java中的一个重要理念,说起面向对象也是老生常谈了。在找资料的时候多是很专业的术语,又或者很多框架的知识点合集,其实大部分人刚看资料的
- <customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性,其中
- 本文实例讲述了java读取properties文件的方法。分享给大家供大家参考。具体实现方法如下:package com.test.demo
- 一 前言这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心。本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,
- 目录字节输入流字节输入流结构图FileInputStream类构造方法:常用读取方法:字节输出流字节输出流结构图:FileOutputStr
- @SuppressWarnings 注解@SuppressWarnings: 抑制编译器警告如下,可以看到idea中有警告的颜色标注当我们不
- 为大家提供的MySQL忘记密码的解决方案,供大家参考,具体内容如下1.在操作系统windows操作系统,xp或win7.中进入如下目录:C:
- 一.RabbitMQ消息丢失的三种情况第一种:生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为