//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include <iostream>
using namespace cv;
using namespace std;//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main()
{//【1】载入原始图片//Mat srcImage1 = imread("5.png", 1);//Mat srcImage2 = imread("6.bmp", 1);Mat srcImage1 = imread("1.jpg", 1);Mat srcImage2 = imread("2.jpg", 1);if (!srcImage1.data || !srcImage2.data){printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n");system("pause");return false;}//imshow("src1", srcImage1);//imshow("src2", srcImage2);//【1--0】/*两张图片一块儿显示*/Size imageSize = srcImage2.size();int height = 240,  width = 360;Mat imageTwo = Mat(imageSize.height, imageSize.width * 2, CV_8UC3);Rect imageLeft(0, 0, imageSize.width, imageSize.height);Rect imageRight(imageSize.width, 0, imageSize.width, imageSize.height);Mat imLeft = imageTwo(imageLeft);Mat imRight = imageTwo(imageRight);srcImage1.copyTo(imLeft);srcImage2.copyTo(imRight);if (imageTwo.data){cv::imshow("image", imageTwo);//cv::waitKey();}//【2】使用SURF算子检测关键点int minHessian = 400;//SURF算法中的hessian阈值SurfFeatureDetector detector(minHessian);//定义一个SurfFeatureDetector(SURF) 特征检测类对象  vector<KeyPoint> keypoints_object, keypoints_scene;//vector模板类,存放任意类型的动态数组//【3】调用detect函数检测出SURF特征关键点,保存在vector容器中detector.detect(srcImage1, keypoints_object);detector.detect(srcImage2, keypoints_scene);//【4】计算描述符(特征向量)SurfDescriptorExtractor extractor;Mat descriptors_object, descriptors_scene;extractor.compute(srcImage1, keypoints_object, descriptors_object);extractor.compute(srcImage2, keypoints_scene, descriptors_scene);//【5】使用FLANN匹配算子进行匹配FlannBasedMatcher matcher;vector< DMatch > matches;matcher.match(descriptors_object, descriptors_scene, matches);double max_dist = 0; double min_dist = 100;//最小距离和最大距离//【6】计算出关键点之间距离的最大值和最小值for (int i = 0; i < descriptors_object.rows; i++){double dist = matches[i].distance;if (dist < min_dist) min_dist = dist;if (dist > max_dist) max_dist = dist;}printf(">Max dist 最大距离 : %f \n", max_dist);printf(">Min dist 最小距离 : %f \n", min_dist);//【7】存下匹配距离小于3*min_dist的点对std::vector< DMatch > good_matches;for (int i = 0; i < descriptors_object.rows; i++){if (matches[i].distance < 3 * min_dist){good_matches.push_back(matches[i]);}}//绘制出匹配到的关键点Mat img_matches;drawMatches(srcImage1, keypoints_object, srcImage2, keypoints_scene,good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//定义两个局部变量vector<Point2f> obj;vector<Point2f> scene;//从匹配成功的匹配对中获取关键点for (unsigned int i = 0; i < good_matches.size(); i++){obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);}Mat H = findHomography(obj, scene, CV_RANSAC);//计算透视变换 //从待测图片中获取角点vector<Point2f> obj_corners(4);obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(srcImage1.cols, 0);obj_corners[2] = cvPoint(srcImage1.cols, srcImage1.rows); obj_corners[3] = cvPoint(0, srcImage1.rows);vector<Point2f> scene_corners(4);//进行透视变换perspectiveTransform(obj_corners, scene_corners, H);//绘制出角点之间的直线line(img_matches, scene_corners[0] + Point2f(static_cast<float>(srcImage1.cols), 0), scene_corners[1] + Point2f(static_cast<float>(srcImage1.cols), 0), Scalar(255, 0, 123), 4);line(img_matches, scene_corners[1] + Point2f(static_cast<float>(srcImage1.cols), 0), scene_corners[2] + Point2f(static_cast<float>(srcImage1.cols), 0), Scalar(255, 0, 123), 4);line(img_matches, scene_corners[2] + Point2f(static_cast<float>(srcImage1.cols), 0), scene_corners[3] + Point2f(static_cast<float>(srcImage1.cols), 0), Scalar(255, 0, 123), 4);line(img_matches, scene_corners[3] + Point2f(static_cast<float>(srcImage1.cols), 0), scene_corners[0] + Point2f(static_cast<float>(srcImage1.cols), 0), Scalar(255, 0, 123), 4);//显示最终结果imshow("效果图", img_matches);waitKey(0);return 0;
}

不同的匹配算法

//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
using namespace std;//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main3()
{//【1】载入图像、显示并转化为灰度图Mat trainImage = imread("1.jpg"), trainImage_gray;imshow("原始图", trainImage);cvtColor(trainImage, trainImage_gray, CV_BGR2GRAY);//【2】检测Surf关键点、提取训练图像描述符vector<KeyPoint> train_keyPoint;Mat trainDescriptor;SurfFeatureDetector featureDetector(80);featureDetector.detect(trainImage_gray, train_keyPoint);SurfDescriptorExtractor featureExtractor;featureExtractor.compute(trainImage_gray, train_keyPoint, trainDescriptor);//【3】创建基于FLANN的描述符匹配对象FlannBasedMatcher matcher;vector<Mat> train_desc_collection(1, trainDescriptor);matcher.add(train_desc_collection);matcher.train();//【4】创建视频对象、定义帧率VideoCapture cap(0);unsigned int frameCount = 0;//帧数//【5】不断循环,直到q键被按下while (char(waitKey(1)) != 'q'){//<1>参数设置int64 time0 = getTickCount();Mat testImage, testImage_gray;cap >> testImage;//采集视频到testImage中if (testImage.empty())continue;//<2>转化图像到灰度cvtColor(testImage, testImage_gray, CV_BGR2GRAY);//<3>检测S关键点、提取测试图像描述符vector<KeyPoint> test_keyPoint;Mat testDescriptor;featureDetector.detect(testImage_gray, test_keyPoint);featureExtractor.compute(testImage_gray, test_keyPoint, testDescriptor);//<4>匹配训练和测试描述符vector<vector<DMatch> > matches;matcher.knnMatch(testDescriptor, matches, 2);// <5>根据劳氏算法(Lowe's algorithm),得到优秀的匹配点vector<DMatch> goodMatches;for (unsigned int i = 0; i < matches.size(); i++){if (matches[i][0].distance < 0.6 * matches[i][1].distance)goodMatches.push_back(matches[i][0]);}//<6>绘制匹配点并显示窗口Mat dstImage;drawMatches(testImage, test_keyPoint, trainImage, train_keyPoint, goodMatches, dstImage);imshow("匹配窗口", dstImage);//<7>输出帧率信息cout << "当前帧率为:" << getTickFrequency() / (getTickCount() - time0) << endl;}return 0;
}

surf算子匹配物体相关推荐

  1. OpenCV SURF FLANN匹配单应性的实例(附完整代码)

    OpenCV SURF FLANN匹配单应性的实例 OpenCV SURF FLANN匹配单应性的实例 OpenCV SURF FLANN匹配单应性的实例 #include <iostream& ...

  2. OpenCV SURF FLANN匹配的实例(附完整代码)

    OpenCV SURF FLANN匹配的实例 OpenCV SURF FLANN匹配的实例 OpenCV SURF FLANN匹配的实例 #include <iostream> #incl ...

  3. 采用 opencv surf 算子进行特征匹配

    opencv docu 源码在git 目录结构 . ├── build ├── CMakeLists.txt ├── main.cpp ├── t1.jpg └── t2.jpg /** @file ...

  4. 图像特征之SURF特征匹配

    原文站点:https://senitco.github.io/2017/06/27/image-feature-surf/   加速鲁棒特征(Speed Up Robust Feature, SURF ...

  5. Opencv Surf算子中keyPoints,描述子Mat矩阵,配对向量DMatch里都包含了哪些好玩的东东?

    Surf算法是一把牛刀,我们可以很轻易的从网上或各种Opencv教程里找到Surf的用例,把例程中的代码或贴或敲过来,满心期待的按下F5,当屏幕终于被满屏花花绿绿的小圆点或者N多道连接线条霸占时,内心 ...

  6. opencv 二维图像 特征检测 特征描述 特征匹配 平面物体识别跟踪

    github代码 一.Harris角点 cornerHarris() R = det(M) - k*(trace(M))^2  算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与 ...

  7. OpneCV3特征提取及匹配SURF算法(一)——SURF概述与代码演示

    前言 1.在目标检测.识别,匹配的应用中,特征点的提取是不可缺少的部分的步骤,在之前博文我演示了HOG特性提取与使用HOG与SVM训练自己的样本进行行人检测. 2.我的编程环境是Windows 7 6 ...

  8. ORB、SURF、SIFT特征点提取方法和ICP匹配方法

    在进行编译视觉SLAM时,书中提到了ORB.SURF.SIFT提取方法,以及特征提取方法暴力匹配(Brute-Force Matcher)和快速近邻匹配(FLANN).以及7.9讲述的3D-3D:迭代 ...

  9. OpenCV中的SURF特征检测、匹配与对象查找

    SURF算法工作原理 选择图像中的POI(Points of interest) Hessian Matrix 在不同的尺度空间发现关键点,非最大信号压制 发现特征点方法.旋转不变性要求 生成特征向量 ...

  10. 机器视觉特征提取:HOG、SIFT、SURF、ORB、LBP、HAAR

    来源:机器学习AI算法工程 本文约6200字,建议阅读10+分钟 本文为你介绍不同的机器视觉特征提取方法及其区别. 目录 一.SIFT(尺度不变特征变换) 二.HOG(方向梯度直方图) 三.SIFT和 ...

最新文章

  1. 每日一皮:天气转凉了,你的长袖穿起来了吗?
  2. 天呐!java生成DAT文件并写入数据
  3. Visual C++ Attribute Programming
  4. 第三次冲刺12.16
  5. 一行代码制作你的专属动态二维码-Python实现
  6. TeamViewer13 -- 安装、使用说明
  7. @RequestBody 和 @RequestParam可以同时使用
  8. ajax加php做的简单登录注册,简单示例AJAX结合PHP代码实现登录效果代码
  9. 安卓饼状图设置软件_Android自定义控件实现饼状图
  10. Kubernetes 健康状态检查liveness和readiness
  11. idea启动azkaban2.5
  12. 外贸网站建设的一些建站方法
  13. Excel笔记(3)常用函数11-20
  14. 小小蜂鸣器,驱动电路可大有学问(重点三极管基极的限流和分压电路)
  15. ActiveX如何在Google上运行
  16. 南京地铁交通部署工程竣工时那些我们不知道的数字,你知道吗?
  17. C语言 五种基本的算术运算符
  18. MacBookPro M1芯片安装brew
  19. 恶搞小程序:鼠标不受控制+无限弹窗
  20. 【Web前端面试】葵花宝典(2022版本)—— CSS篇

热门文章

  1. C++ wchar_t转char
  2. java css文件预处理_浅谈 CSS 预处理器: 为什么要使用预处理器?
  3. pulse 去马赛克软件_Github高赞:打马赛克=形同虚设,AI看透你一切小心思
  4. java 菜单快捷键_Java为菜单栏添加快捷键
  5. geany怎么创建文件夹_在visual studio中创建win32应用程序
  6. 工业互联网发展驶入快车道
  7. 为了战略发展,Adobe推出自己浏览器?
  8. php中的冒泡排序和选择排序d
  9. win7生成ssh key配置到gitlab
  10. std::ostringstream