上一篇已经做出了KAZE(AKAZE)局部特征的检测,就差匹配没有做到。
那么,现在来实现一下:

放上代码:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>using namespace cv;
using namespace std;Mat img1,img2;
int main(int argc, char** argv)
{img1 = imread("D:/test/box.png", IMREAD_GRAYSCALE);img2 = imread("D:/test/box_in_scene.png", IMREAD_GRAYSCALE);if (!img1.data||!img2.data){printf("图片未找到...");return -1;}imshow("input box", img1);imshow("input box_in_scene", img2);double t1 = getTickCount();//检测特征点(非线性)Ptr<AKAZE>detector = AKAZE::create();//Ptr<KAZE>detector = KAZE::create();//KAZE检测//存放描述子Mat descriptor_obj,descriptor_scene;//img1特征点检测并计算描述子vector<KeyPoint> keypoints_obj;detector->detectAndCompute(img1, Mat(), keypoints_obj, descriptor_obj);//img2特征点检测并计算描述子vector<KeyPoint> keypoints_scene;detector->detectAndCompute(img2, Mat(), keypoints_scene,descriptor_scene);double t2 = getTickCount();double t = (t2 - t1) * 1000 / getTickFrequency();//结果转化为毫秒printf("特征点寻找所花费时间(ms):%f", t);//使用FLANN匹配器比较两个关键点的匹配度FlannBasedMatcher fbMatcher(new flann::LshIndexParams(20,10,2));//用LshIndexParams/*这里不能使用FlannBasedMatcher fbMatcher();这条语句,因为它不支持CV_8UC1类型,会报错,OpenCv暂时还没有解决这一问题。*///也可以使用暴力匹配(BFMatcher bfmatches;)BFMatcher bfmatches;vector<DMatch>matches;fbMatcher.match(descriptor_obj, descriptor_scene, matches);//绘制匹配线Mat resultImg;drawMatches(img1, keypoints_obj, img2, keypoints_scene, matches, resultImg,Scalar::all(-1), Scalar::all(-1),vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);/*最后一个参数使用DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS就可以把检测到的特征点隐去,只留下匹配到的特征点。*/imshow("AKAZE Matches", resultImg);/*那么上面的操作所显示的结果匹配到的特征点很多,为了减少多余的特征点,下面进行如下操作*/vector<DMatch>goodmatches;//保存从众多匹配点中找出的最优点/*1、遍历整个描述子;2、从描述子中找出最优匹配点(距离最小)*/double minDist = 1000;//初始化double maxDist = 0;for (int i = 0; i < descriptor_obj.rows; i++){double dist = matches[i].distance;if (dist > maxDist){maxDist = dist;}if (dist < minDist){minDist = dist;}}for (int i = 0; i < descriptor_obj.rows; i++){double dist = matches[i].distance;if (dist < max(2 * minDist, 0.02)){goodmatches.push_back(matches[i]);}}Mat goodmatchesImg;drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodmatches, goodmatchesImg,Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);imshow("goodmatchesImg", goodmatchesImg);//用线匹配不直观,用透视矩阵来做//-------------------平面对象识别(将匹配到的内容替换为矩形)--------------------------//生成透视变换矩阵vector<Point2f> obj;vector<Point2f> objinscene;for (size_t i = 0; i < goodmatches.size(); i++){obj.push_back(keypoints_obj[goodmatches[i].queryIdx].pt);objinscene.push_back(keypoints_scene[goodmatches[i].trainIdx].pt);}Mat H = findHomography(obj, objinscene, RANSAC);     //生成透视变换矩阵vector<Point2f> obj_corner(4);//源图片4个角的坐标vector<Point2f> objinscene_corner(4);obj_corner[0] = Point(0,0);obj_corner[1] = Point(img1.cols, 0);obj_corner[2] = Point(img1.cols, img1.rows);obj_corner[3] = Point(0, img1.rows);//------------------透视变换---------------------perspectiveTransform(obj_corner, objinscene_corner, H);Mat pptfImg= goodmatchesImg.clone();line(pptfImg, objinscene_corner[0] + Point2f(img1.cols, 0), objinscene_corner[1] + Point2f(img1.cols, 0), Scalar(0, 0, 255), 2, 8, 0);line(pptfImg, objinscene_corner[1] + Point2f(img1.cols, 0), objinscene_corner[2] + Point2f(img1.cols, 0), Scalar(0, 0, 255), 2, 8, 0);line(pptfImg, objinscene_corner[2] + Point2f(img1.cols, 0), objinscene_corner[3] + Point2f(img1.cols, 0), Scalar(0, 0, 255), 2, 8, 0);line(pptfImg, objinscene_corner[3] + Point2f(img1.cols, 0), objinscene_corner[0] + Point2f(img1.cols, 0), Scalar(0, 0, 255), 2, 8, 0);imshow("pptfImg", pptfImg);waitKey(0);return 0;
}

具体说明已经在注释中有说明。
运行结果:

OpenCv-C++-KAZE(AKAZE)局部特征匹配(二)相关推荐

  1. opencv AKAZE 局部特征匹配算法

    AKAZE 局部特征匹配 级联分类器使用 等比例缩放图片 给图片加logo 鱼眼校正 智能答卷识别 opencv滤镜效果 灰度图像增强方式 基础知识点 AKAZE特征提取算法是局部特征描述子算法,是S ...

  2. OpenCV + CPP 系列(卌二)图像特征匹配( KAZE/AKAZE)

    文章目录 一.KAZE简介 二.代码演示 特征检测效果对比 演示匹配 一.KAZE简介 ECCV2012中出现了一种比SIFT更稳定的特征检测算法KAZE ([1]).KAZE的取名是为了纪念尺度空间 ...

  3. C++ OpenCV特征提取之KAZE和AKAZE的匹配

    前言 前面我们通过两章<C++ OpenCV特征提取之KAZE检测><C++ OpenCV特征提取之AKAZE检测>介绍了KAZE和AKAZE的特征子描述,今天我们就来做一下K ...

  4. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  5. 【OpenCV 例程200篇】73. 二维连续傅里叶变换

    [OpenCV 例程200篇]73. 二维连续傅里叶变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 2.1 二维 ...

  6. python opencv图片拼接、特征点匹配

    一.算法目的: 在同一位置拍摄的两幅或者多幅图像是单应性相关的的,使用该约束将很多图片缝补起来,拼成一个大的图像来创建全景图像.两张图片的拼接必须首先找到相同特征,也就是说两张照片必须要有重叠的部分才 ...

  7. OpenCv-C++-KAZE(AKAZE)局部特征检测(一)

    KAZE与AKAZE都是OpenCv中集成的API算法,AKAZE是KAZE的加速版本(A表示Accelerated(加速的)).且AKAZE的执行效率要优于KAZE. 与SURF和SIFT不同(基于 ...

  8. OpenCV之特征点模板匹配

    OpenCV之特征点模板匹配 版权声明:博文为博主原创文章,转载请注明出处 :https://blog.csdn.net/ganbelieve/article/details/89959505 介绍一 ...

  9. OpenCV C++案例实战三十二《字符识别》

    OpenCV C++案例实战三十二<字符识别> 前言 一.结果演示 二.制作数据集 三.字符识别 四.源码 总结 前言 本案例将使用OpenCV C++ 进行字符识别.主要包括制作数据集. ...

最新文章

  1. java开发经验分享_java开发经验分享(一)
  2. Python高级特性: 函数编程 lambda, filter,map,reduce
  3. pytorch 中 Autograd(四)
  4. mapreduce的shuffle机制(来自学习笔记)
  5. 你是否觉得.Net Web Service 中asmx文件是多余的?
  6. imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例
  7. 小程序保存base64类型图片和普通图片实例
  8. ubuntu c++检测usb口事件变化_炼就“火眼金睛”,FETA40i-C核心板“牵手”光时域反射仪...
  9. 漫步最优化四十五——矩阵S的生成
  10. Go error 处理实践
  11. 内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
  12. 刘海屏的MacBook Pro还值得入手吗?
  13. Maven-Eclipse使用maven创建HelloWorld Java项目
  14. Tuxera NTFS2022产品密钥 mac读取ntfs格式驱动程序
  15. ffmpeg合并mp4脚本
  16. TCP快速恢复算法PRR
  17. SPARC架构下的反汇编(一)——SPARC简介
  18. 融合正弦余弦和无限折叠迭代混沌映射的蝴蝶优化算法-附代码
  19. 【codeforces 707C】Pythagorean Triples
  20. 树的数据结构代码_如何以无代码方式学习树数据结构

热门文章

  1. 360n4s普通版Android7,360手机N4S骁龙版是什么意思 360N4S骁龙版与普通版的区别有哪些...
  2. 浅谈矩阵变换——Matrix
  3. ZZULIOJ:1071: 分解质因子
  4. java局域网通信_java局域网通信
  5. Scipy-kmeans聚类
  6. 【ZJOI2017】仙人掌 题解
  7. 机器学习-周志华-学习记录-第一章绪论
  8. ES, MongoDB, HBase的区别和使用场景
  9. 优秀的 Verilog/FPGA开源网站介绍
  10. m4s转为mp4实例:使用ffmpeg和批处理将m4s转为mp4