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 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...
随机推荐
- 提取ecshop的mysql类
在下一篇文章中,我还将介绍如何完善ecshop的mysql类,使用ecshop的数据库前缀 下载ecshop后,解压缩,进入目录upload/includes,复制里面的cls_mysql.php放进 ...
- JavaScript判断移动端及pc端访问不同的网站
JavaScript判断移动端及pc端访问不同的网站 现在很多网站都是分为两个版本,一个pc端的一个移动端的(响应式除外),针对这两个版本,就需要对访问的设备进行判断,如果是pc,就直接访问pc网站, ...
- Your awesome titleHH
Welcome to Jekyll! Your awesome titleHH About Blogging Like a Hacker Welcome to Jekyll! Jan 9, 2016 ...
- Delphi自己隐藏自定义弹出列表
先上代码 procedure TForm3.Timer1Timer(Sender: TObject); var Point: TPoint; Name: array[0..255] of Char; ...
- 浅析 Linux 初始化 init 系统
近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经逐渐淡出历史舞台,新的 UpStart 和 systemd 各有特点,越来越多的 Linux 发行版采纳了 ...
- gulp es7配置文件
http://sanwen.net/a/ybsfcoo.html /** * Created by udi on 2016/11/24. */ var gulp = require('gulp'); ...
- 送干货,实用内联gulp插件——gulp-embed
现在npm上有很多gulp内联工具,用于把脚本和样式内嵌到HTML页面上,之前搞项目我也在这些插件中寻觅许久,但均不满足公司项目的一个需求—— HTML上同时插入了开发(dev版,src文件夹下,比如 ...
- ASP.NET MVC SSO单点登录设计与实现
实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...
- 我所理解的RESTful Web API [Web标准篇]
REST不是一个标准,而是一种软件应用架构风格.基于SOAP的Web服务采用RPC架构,如果说RPC是一种面向操作的架构风格,而REST则是一种面向资源的架构风格.REST是目前业界更为推崇的构建新一 ...
- iOS开发——高级技术&本地化与国际化详解
本地化与国际化详解 效果如下: 英语: 中文: 具体实现如下: ...