0、国外原文链接

Homography examples using OpenCV ( Python / C ++ )

1、什么是单应性?

考虑图中显示的平面。红点代表两个图像中的相同物理点。在计算机视觉术语中,我们将这些对应点。图中显示了四种不同颜色的四个对应点:红色、绿色、黄色和橙色。单应性(3 * 3的矩阵)是指从图像中的一个点映射到另一张图像中的对应点的变换。


3 * 3的单应矩阵可以写成如下形式:
H=[h00h01h02h10h11h12h20h21h22]H=\left[\begin{array}{lll} h_{00} & h_{01} & h_{02} \\ h_{10} & h_{11} & h_{12} \\ h_{20} & h_{21} & h_{22} \end{array}\right] H=⎣⎡​h00​h10​h20​​h01​h11​h21​​h02​h12​h22​​⎦⎤​
让我们考虑两幅图中对应的第一组点,单应性矩阵通过如下方式进行映射:
[x1y11]=H[x2y21]=[h00h01h02h10h11h12h20h21h22][x2y21]\left[\begin{array}{c} x_{1} \\ y_{1} \\ 1 \end{array}\right]=H\left[\begin{array}{c} x_{2} \\ y_{2} \\ 1 \end{array}\right]=\left[\begin{array}{lll} h_{00} & h_{01} & h_{02} \\ h_{10} & h_{11} & h_{12} \\ h_{20} & h_{21} & h_{22} \end{array}\right]\left[\begin{array}{c} x_{2} \\ y_{2} \\ 1 \end{array}\right] ⎣⎡​x1​y1​1​⎦⎤​=H⎣⎡​x2​y2​1​⎦⎤​=⎣⎡​h00​h10​h20​​h01​h11​h21​​h02​h12​h22​​⎦⎤​⎣⎡​x2​y2​1​⎦⎤​
只要它们在现实世界的同一平面上,上述等式都是成立的。换句话说,可以将单应性应用到第一张图上,第一张图中的书就会和第二张图中的书对齐。
上式中的xy坐标是齐次坐标,关于其次坐标可以参考我这篇文章,什么是齐次坐标?为什么要引入齐次坐标?

但是那些不在平面上的点呢?不在平面上的点不会通过单应性对齐,场景是平面,或者近似平面,或者低视差时都可以应用单应性矩阵。

如果图像中有两个平面呢?两个平面对应两个单应变换,每个平面对应一个单应性矩阵。

2、使用OpenCV的单应性示例

如果两个图像之间的单应性已知,我们可以将一个图像扭曲到另一个图像上。注意图像必须包含在一个平面上,只有同一平面上才能正确对齐。事实证明,如果你拍一张任何场景的照片(不仅仅是一个平面),然后通过旋转相机拍摄第二张照片,这两张图像通过单应性联系在一起。换句话说,可以将相机安装在三脚架上并拍拍照,然后绕着垂直轴并拍摄另一张图像。

3、如何计算单应性矩阵?

为了计算两个图像之间的单应性,需要知道两个图像之间的至少4个点对应关系,多余4个对应点更好。估计出最适合所有对应点的单应性矩阵。通常,这些点对应是通过图像之间的SIFT或SURF等特征匹配自动找到的。

3.1、C++

// pts_src 和 pts_dst 是源图像和目标图像中点的向量。它们的类型为 vector<Point2f>。至少需要4个对应点。
Mat h = findHomography(pts_src, pts_dst);// 单应性矩阵可以将原图像扭曲到目标图像,im_src 和 im_dst 属于 Mat 类型。 size 是 im_dst 的大小(宽、高)。
warpPerspective(im_src, im_dst, h, size);

3.2、C++完整代码,从两张图中分别取4个对应的点,并将原图扭曲到目标图

#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;int main(int argc, char** argv) {// Read source image.Mat im_src = imread("book2.jpg");// Four corners of the book in source imagevector<Point2f> pts_src;pts_src.push_back(Point2f(141, 131));pts_src.push_back(Point2f(480, 159));pts_src.push_back(Point2f(493, 630));pts_src.push_back(Point2f(64, 601));// Read destination image.Mat im_dst = imread("book1.jpg");// Four corners of the book in destination image.vector<Point2f> pts_dst;pts_dst.push_back(Point2f(318, 256));pts_dst.push_back(Point2f(534, 372));pts_dst.push_back(Point2f(316, 670));pts_dst.push_back(Point2f(73, 473));// Calculate HomographyMat h = findHomography(pts_src, pts_dst);// Output imageMat im_out;// Warp source image to destination based on homographywarpPerspective(im_src, im_out, h, im_dst.size());// Display imagesimshow("Source Image", im_src);imshow("Destination Image", im_dst);imshow("Warped Source Image", im_out);waitKey(0);
}

3.3、Python

h, status = cv2.findHomography(pts_src, pts_dst)
im_dst = cv2.warpPerspective(im_src, h, size)

3.4、Python完整代码

#!/usr/bin/env pythonimport cv2
import numpy as npif __name__ == '__main__' :# Read source image.im_src = cv2.imread('book2.jpg')# Four corners of the book in source imagepts_src = np.array([[141, 131], [480, 159], [493, 630],[64, 601]])# Read destination image.im_dst = cv2.imread('book1.jpg')# Four corners of the book in destination image.pts_dst = np.array([[318, 256],[534, 372],[316, 670],[73, 473]])# Calculate Homographyh, status = cv2.findHomography(pts_src, pts_dst)# Warp source image to destination based on homographyim_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))# Display imagescv2.imshow("Source Image", im_src)cv2.imshow("Destination Image", im_dst)cv2.imshow("Warped Source Image", im_out)cv2.waitKey(0)

4、单应性的应用

单应图最有趣的应用无疑是制作全景图(也就是图像拼接和图像拼接)。

4.1、使用单应性进行透视校正

点击上面图像中书本的四个角落,就可以快速获取下图所示的书本图像。

  • 首先获取原图像四个角点坐标,称为pts_src;
  • 获取书的长宽比,对于这本书,长宽比为4比3,所以可以选择输出图像尺寸为300*400,目标点pts_dst为(0, 0)、(299, 0)、(299, 399)、(0, 399);
  • 使用pts_src和pts_dst获得单应性矩阵;
  • 将单应性应用于源图像,获得目标图像;

4.2、虚拟广告牌

在许多电视转播的体育赛事中,广告实际上是在视频直播中插入的。例如,在足球和棒球比赛中,恰好位于球场边界外的小广告牌上的广告实际上是可以改变的。与向所有人展示相同的广告不同,广告商可以根据用户的人口特征、位置等选择广告。

在这些应用中,在视频中检测广告牌的四个角作为目的点。广告的四个角作为源点。基于这四个对应点计算单应性,并将其用于将广告扭曲到视频帧中。如下图所示,将广告插入到图像中,我们可以把时代广场的广告牌换成我们想要的形象。

  • 首先获取广告牌的四个角点坐标,pts_dst;
  • 想要放在虚拟广告牌上的源图像的大小为w * h,因此图像的角为(0, 0)、(w-1, 0)、(w -1, h -1)、(0, h - 1);
  • 使用pts_src和pts_dst获得单应性矩阵;
  • 对源图像进行单应性处理,将源图像与目标图像混合;

[计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)相关推荐

  1. 单应性矩阵Homography计算和优化

    单应性矩阵,是用来描述两个平面之间的变换关系,是一个3x3的齐次矩阵. 图上的4个绿色的圈,两两可以对应,H可以表达第一张图变换到第二张图的转换关系.具体的表达式: aaa表示尺度信息,h1−h9h_ ...

  2. 【opencv学习】单应性变换Homography

    import cv2 import numpy as np import pylab as pltif __name__ == '__main__':# 读取原始图像im_src = cv2.imre ...

  3. OpenCV-C++实现单应性矩阵的求解

    1. 单应性矩阵的理解 1.1 图像层面 单应性矩阵(Homography)约束了同一3D空间点在两个像素平面的2D齐次坐标. 单应性矩阵具有8个自由度,已知A和B两张图像上的四对点,即可列出八个方程 ...

  4. 一篇文章教你学会使用SpringBatch 监听器Listener

    文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...

  5. 一篇文章教你学会使用SpringBoot实现文件上传和下载

    文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...

  6. 一篇文章教你学会实现模糊搜索结果的关键词高亮显示

    一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...

  7. 一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite)

    一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite) 一.什么是雪碧图? 雪碧图(CSS Sprite)又叫CSS精灵图,是一种网页图片应用处理方式,他允许你将一个页面设计到 所有零星图片 ...

  8. 计算机视觉教程1-2:单应性矩阵估计

    目录 1 导论 2 基本直接线性变换(Basic DLT) 3 归一化直接线性变换(Normalized DLT) 4 鲁棒单应性估计(Robust Homography Estimation) 1 ...

  9. 计算机视觉学习笔记(四)homography 单应性矩阵的理解及求解

    单应性矩阵的理解及求解 1. 齐次坐标(Homogeneous Coordinate) 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y, ...

最新文章

  1. cbow 和skip-gram比较
  2. 华为harmonyos 2.0,华为王成录博士:HarmonyOS 2.0给消费者不一样的体验
  3. 收藏!全国31个省市区重点产业布局!
  4. LeetCode | Minimum Depth of Binary Tree
  5. 【成都站参会指南】神策 2020 数据驱动用户大会,邀您面基!
  6. 机器学习与不确定性_机器学习求职中的不确定性
  7. 【java】java 如何抛出 sleep interrupted
  8. 蓝桥杯 ALGO-60 算法训练 矩阵乘方
  9. Git (10)-- 打标签(git tag)
  10. DataWindow修改的单元格文字颜色改变
  11. 怎样无损调整分区大小和扩容分区?
  12. Codeforces1194C
  13. 其实带宽≠速度 ADSL加速法完全功略
  14. 初学者入门级!Python基础知识学习,纯干货【建议收藏】
  15. 罗杨美慧 20190919-2 功能测试
  16. 全栈工程师为啥值40W的年薪?
  17. C语言中: 整型数据相除 得到浮点型数据
  18. eNSP上华为路由器开SNMP
  19. 联想ERP项目实施案例分析(8) 上线支持与项目总结
  20. 46、Flutter之 布局组件 流式布局Wrap,Flow

热门文章

  1. Python爬虫与数据分析
  2. watch取消配对怎么重新配对_Apple Watch 怎么重新配对iphone手机
  3. 南昌大学 计算机专业,考研:计算机专业选深圳大学和南昌大学?老师给出一个实用建议...
  4. uni-app:uni-ui的使用
  5. python 微信发送图片_使用python向企业微信发送文字和图片消息
  6. postgre数据库字符串函数和日期函数操作小记
  7. 屌爆了的两个在线编辑网站runjs和jsbin
  8. MOS管驱动电路及注意事项-KIA MOS管
  9. 小学奥数思维训练题(三)
  10. 将python代码打印成pdf