Projects\image_match3图像特征匹配调试记录

D:\文件及下载相关\文档\Visual Studio 2010\Projects\image_match3\image_match

#include "opencv2/core/core.hpp"
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
   //待匹配的两幅图像,其中img1包括img2,也就是要从img1中识别出img2
   //Mat img1 = imread("book_in_scene.png");
   //Mat img2 = imread("book2.png");
   Mat img1 = imread("003.png");
   Mat img2 = imread("004.png");

   Mat image01;
   Mat image02;
   cvtColor(img1,image01,CV_RGB2GRAY);
   cvtColor(img2,image02,CV_RGB2GRAY);
   SIFT sift1, sift2;

   vector<KeyPoint> key_points1, key_points2;

   Mat descriptors1, descriptors2, mascara;

   sift1(img1,mascara,key_points1,descriptors1);
   sift2(img2,mascara,key_points2,descriptors2);

   //实例化暴力匹配器——BruteForceMatcher
   BruteForceMatcher<L2<float>> matcher;
   //定义匹配器算子
   vector<DMatch>matches;
   //实现描述符之间的匹配,得到算子matches
   matcher.match(descriptors1,descriptors2,matches);

   //提取出前3个最佳匹配结果
   nth_element(matches.begin(),     //匹配器算子的初始位置
       matches.begin()+9,     // 排序的数量
       matches.end());       // 结束位置
   //剔除掉其余的匹配结果
   matches.erase(matches.begin()+10, matches.end());

   namedWindow("SIFT_matches");
   Mat img_matches;
   //在输出图像中绘制匹配结果
   drawMatches(img1,key_points1,         //第一幅图像和它的特征点
       img2,key_points2,      //第二幅图像和它的特征点
       matches,       //匹配器算子
       img_matches,      //匹配输出图像
       Scalar(255,255,255));     //用白色直线连接两幅图像中的特征点
   imshow("SIFT_matches",img_matches);

    vector<Point2f> imagePoints1,imagePoints2;
    for(int i=0;i<10;i++)
    {
        imagePoints1.push_back(key_points1[matches[i].queryIdx].pt);
        imagePoints2.push_back(key_points2[matches[i].trainIdx].pt);
    }

   Mat homo=findHomography(imagePoints1,imagePoints2,CV_RANSAC);
   ////也可以使用getPerspectiveTransform方法获得透视变换矩阵,不过要求只能有4个点,效果稍差  
   //Mat homo=getPerspectiveTransform(imagePoints1,imagePoints2);     
   cout<<"变换矩阵为:\n"<<homo<<endl<<endl;//输出映射矩阵  
   //图像配准  
   Mat imageTransform1,imageTransform2;
   warpPerspective(image01,imageTransform1,homo,Size(image02.cols,image02.rows));
   imshow("经过透视矩阵变换后",imageTransform1);
   waitKey(0);

   return 0;
}

 Mat img1 = imread("003.png");
 Mat img2 = imread("004.png");

测试两个方向拍摄的熊娃娃:

原文地址:https://www.cnblogs.com/wxl845235800/p/8677569.html

时间: 2024-08-29 20:06:03

Projects\image_match3图像特征匹配调试记录的相关文章

Robotics Lab3 ——图像特征匹配、跟踪与相机运动估计

Robotics Lab3 --图像特征匹配.跟踪与相机运动估计 图像特征匹配 图像特征点 携带摄像头的机器人在运动过程中,会连续性地获取多帧图像,辅助其感知周围环境和自身运动.时间序列上相连的两幅或多幅图像,通常存在相同的景物,只是它们在图像中的位置不同.而位置的变换恰恰暗含了相机的运动,这时就需要相邻图像间的相似性匹配. 选取一大块图像区域进行运动估计是不可取的.已知图像在计算机内部是以数字矩阵的形式存储的,[如灰度图的每个元素代表了单个像素的灰度值].而对于点的提取和匹配较为方便,且和数字

CUDA_进行图像特征匹配V2.0

在V1.0的基础上改变了排序方式并对部分并行代码进行了优化 #include "cuda_runtime.h"#include "device_launch_parameters.h"#include <string>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <fstream>#include <sstream&g

OpenCv sift算法 图像特征匹配

基于OpenCv 2.4.6 1 #include "highgui.h" 2 3 //#include "features2d/features2d.hpp"// 4 #include <opencv2/nonfree/features2d.hpp> 5 #include<opencv2/legacy/legacy.hpp> 6 #include <iostream> 7 using namespace std; 8 using

特征检测和特征匹配方法

一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是, 从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像. 只要图像中有足够多可检

OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

http://www.cnblogs.com/skyfsm/p/7401523.html 一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是

[翻译]鲁棒的尺度不变特征匹配在遥感图像配准中应用(Robust Scale-Invariant Feature Matching for Remote Sensing Image Registration)

李乔亮,汪国有,刘建国,会员,IEEE,和陈少波 2008年8月7日接收;2008年10月22日和2008年11月27日修改.2009年2月2日首版:当前版本出版于2009年4月17日.本项工作由中国国家基础研究项目60672060资助. 中国湖北省武汉市华中科技大学模式识别与人工智能国家重点实验室,邮编430074(邮箱:[email protected];   [email protected];  [email protected];  [email protected]) 数字对象识别编

图像特征点提取方法对比及特征点匹配方法

特征点提取方法 官网的文档 对特征的理解 Understanding Features harris特征点 Harris Corner Detection Shi-Tomasi特征点 Shi-Tomasi Corner Detector & Good Features to Track FAST特征点  FAST Algorithm for Corner Detection SIFT特征点 Introduction to SIFT (Scale-Invariant Feature Transfo

OpenCV学习笔记[5]FLANN特征匹配

OpenCV学习笔记:FLANN特征匹配 本次给出FLANN特征匹配的Java实现. [简介] 特征匹配记录下目标图像与待匹配图像的特征点(KeyPoint),并根据特征点集合构造特征量(descriptor),对这个特征量进行比较.筛选,最终得到一个匹配点的映射集合.我们也可以根据这个集合的大小来衡量两幅图片的匹配程度. 特征匹配与模板匹配不同,由于是计算特征点集合的相关度,转置操作对匹配影响不大,但它容易受到失真.缩放的影响. [特征匹配] FeatureMatching.java: imp

OpenCV2:特征匹配及其优化

在OpenCV2简单的特征匹配中对使用OpenCV2进行特征匹配的步骤做了一个简单的介绍,其匹配出的结果是非常粗糙的,在这篇文章中对使用OpenCV2进行匹配的细化做一个简单的总结.主要包括以下几个内容: DescriptorMatcher DMatcher KNN匹配 计算两视图的基础矩阵F,并细化匹配结果 计算两视图的单应矩阵H,并细化匹配结果 DescriptorMatcher 和 DMatcher DescriptorMatcher是匹配特征向量的抽象类,在OpenCV2中的特征匹配方法