OpenCV,计算两幅图像的单应矩阵
平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography)。计算出两幅图像之间的单应矩阵H,那么应用这个关系可以将一个视图中的
所有点变换到另一个视图中。



上图,最右边图像是将最左边图像进行了一次射影变换,变换到中间图像视图后的图像。
使用OpenCV可以调用库函数findHomography计算两幅图像的单应矩阵,其声明如下
Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=, double ransacReprojThreshold=, OutputArray mask=noArray() )
单应矩阵的计算需要两幅图像中相对应的点,srcPoints,dstPoints是两幅图像中相对应的点,可以是Vector<Point2f>或者是CV_32FC2类型的矩阵,Method是计算单应矩阵时所使用的方法。
得到了图像的单应矩阵H就可以使用函数warpPerspective将图像变换到另一个视图中
void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
下面就使用上面提到的两个函数,计算出两幅图像之间的单应矩阵H,并且将两幅图像合并为一副图像。

其操作过程非常简单,
- 在“大”图像(目标图像)上选择4个点和“小”图像(被合并图像)的四角做对应,然后根据这4对对应的点计算两幅图像的单应矩阵。
- 得到单应矩阵H后,利用函数warpPerspective将H应用到“小”图像上,得到图像M
- 将图像M合并到目标图像中选择的四个点的位置
实现
首先定义两个vector保存对应的4对点
//4对相对应的像点计算图像的单应 Homography
vector<Point2f> left_image;
vector<Point2f> right_image;
将小图像的四角坐标插入到left_image中
left_image.push_back(Point2f(, ));
left_image.push_back(Point2f(, image_logo.rows));
left_image.push_back(Point2f(image_logo.cols, image_logo.rows));
left_image.push_back(Point2f(image_logo.cols, ));
在在大图中选择4个点,并用这4对相对应的点计算单应矩阵H
if (e == EVENT_LBUTTONDOWN){
if (right_image.size() < ){
right_image.push_back(Point2f(float(x), float(y)));
cout << x << " " << y << endl;
}
else {
cout << "Calculating Homography" << endl;
setMouseCallback("Display window", nullptr, nullptr);
Mat H = findHomography(left_image, right_image, );
Mat logoWarped;
warpPerspective(image_logo, logoWarped,H, image_main.size());
showFinal(image_main, logoWarped);
}
}
最后,将logoWarped和main图像相加就得到最后结果。
详细代码:https://github.com/brookicv/opencvSample/tree/master/Homography
OpenCV,计算两幅图像的单应矩阵的更多相关文章
- 【OpenCV学习】计算两幅图像的重叠区域
问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图 ...
- Opencv实现两幅图像融合
实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar() addWeighted方法: 函数原型: void addWeig ...
- OpenCv实现两幅图像的拼接
直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...
- OpenCV --- 实现两幅图像并排合并(ROI)
Mat img1 = imread("1.png"); Mat img2 = imread("2.png"); int height = img1.rows; ...
- OpenCV 对两幅图像求和(求混合(blending))
#include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; int m ...
- SLAM入门之视觉里程计(5):单应矩阵
在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...
- 2D-2D:对极几何 基础矩阵F 本质矩阵E 单应矩阵H
对极约束 \[ \boldsymbol{x}_{2}^{T} \boldsymbol{F} \boldsymbol{x}_{1}=\boldsymbol{0} \quad \hat{\boldsymb ...
- OpenCV 学习笔记(0)两幅图像标定配准
参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...
- CV 两幅图像配准
http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...
随机推荐
- gem安装报错解决方法
gem install rdiscount -- --use-system-libraries
- spring xmlns 记录
spring xmlns 命名空间可从: http://www.springframework.org/schema/ 根据需求选择 如: 1.选择 : aop ...
- 【codevs】刷题记录→_→(推荐看!)
注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷 学长☞hzwer ...
- C# 定时器 Timers.Timer Forms.Timer
1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...
- 使用Spring JdbcTemplate实现数据库操作
今天我来演示 关于JDBCTemplate实现对数据库的查询和添加 首先是添加 第一步大家都知道 创建一个实体类 然后写一个方法 把实体类当参数传进去 在实现这个接口 JdbcDaoSupport这个 ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- 剑指Offer面试题:3.替换空格
一.题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 在网络编程中 ...
- MySQL实现嵌套集合模型
MySQL实现嵌套集合模型 译文主要是介绍如何用MySQL来存储嵌套集合数据.在其中会增加一些自己的理解,也会删除掉一些自认为无用的废话. 这篇文章主要讲的是嵌套集合模型,所以邻接表不是本文的重点,简 ...
- 如何理解T-SQL中Merge语句
写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...
- Java 浅析三大特性之一多态
Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...