点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

图像处理之理解Homography matrix(单应性矩阵)

单应性矩阵是投影几何中一个术语,本质上它是一个数学概念,但是在OpenCV中却是有几个函数与透视变换相关的函数,都用到了单应性矩阵的概念与知识。小编跟很多人一样,刚开始学习图像处理对单应性矩阵不是很了解,通过项目实践慢慢知道了一些这方面的知识和自己对它的理解,就跟大家分享一下。

单应性矩阵概念

这里说的单应性矩阵主要是指平面单应性矩阵,在三轴坐标中XYZ,Z=1这个有点类似于三维的齐次坐标。单应性矩阵主要用来解决两个问题,

  • 一是表述真实世界中一个平面与对应它图像的透视变换

  • 二是从通过透视变换实现图像从一种视图变换到另外一种视图

首先看一下在三维空间中任意两个平面

上图的中零点分别表示两个平面中任意两个点,a1、a2与b1、b2是这两点对应的两个方向上的线性向量。对于这两个平面直接的关系我们就可以通过这些点从而进一步确立两个平面直接的关系,而两个平面之间的关系用单应性矩阵来描述如下:

  • H表示单应性矩阵,定义了八个自由度。

这种关系被称为平面单应性。这个当中有一些数学知识推导,感兴趣的大家可以自己去看,我们最重要的是明白这个概念怎么来的。其次知道它的应用场景,下面我们就从应用层面和代码层面来说说单应性矩阵的应用。

- 用来解决拍照时候图像扭曲问题。这个在上一篇文章透视   变换中讲过,但是   当时没有说这个是单应性矩阵的应用。

- 此外还两个计算机图形学的应用场景分布是纹理渲染与计算平面阴影。

- 用来实现图像拼接时候解决对齐问题

应用案例

街拍的时候路两边有很多广告牌,如果在视频实时帧中获取到对应的广告牌位置,就可以获取广告牌的四个角坐标,然后通过准备好的内容,将广告牌内容替换,得到想要的虚拟广告牌效果,而这个过程中最重要的一步,可以通过计算单应性矩阵实现内容替换,演示效果如下:

时代广场的街拍

看到左侧的广告牌不,我们准好了一张图像,准备替换它的内容,准备的图像如下:

最终处理之后的效果如下:

实现代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {// load imagesMat src = imread("D:/vcprojects/images/times-square.jpg");if (!src.data) {printf("could not load image...\n");return -1;}// show imagesnamedWindow("input image", CV_WINDOW_AUTOSIZE);imshow("input image", src);Mat replaceImg = imread("D:/vcprojects/images/kgirls.png");imshow("adv content", replaceImg);// 定义两个平面上四个角坐标vector<Point> src_corners(4);vector<Point> dst_corners(4);// 原图像平面四点坐标src_corners[0] = Point(0, 0);src_corners[1] = Point(replaceImg.cols, 0);src_corners[2] = Point(0, replaceImg.rows);src_corners[3] = Point(replaceImg.cols, replaceImg.rows);// 目标平面四个角坐标dst_corners[0] = Point(70, 131);dst_corners[1] = Point(168,216);dst_corners[2] = Point(21, 199);dst_corners[3] = Point(148, 267);// 计算单应性矩阵与透视变换Mat h = findHomography(src_corners, dst_corners);Mat output_img;warpPerspective(replaceImg, output_img, h, src.size());// create maskMat m1 = Mat::zeros(replaceImg.size(), CV_8UC1);m1 = Scalar(255);Mat mask_output;warpPerspective(m1, mask_output, h, src.size());imshow("Mask Result", mask_output);// use maskMat result1;add(output_img, output_img, result1, mask_output);Mat result2;bitwise_not(mask_output, mask_output);add(src, result1, result2, mask_output);// put them togetherMat result;add(result1, result2, result);imshow("Final Result", result);imwrite("D:/vcprojects/images/result.png", result);waitKey(0);return 0;
}

代码中的注释已经很详细啦,最近比较忙,文章发的不多,感谢大家支持!

好消息!

小白学视觉知识星球

开始面向外开放啦

图像处理之理解Homography matrix(单应性矩阵)相关推荐

  1. Homography matrix(单应性矩阵)在广告投放中的实践

    原文首发于微信公众号「3D视觉工坊」. 前言 由于近期在研究相机与投影仪的标定程序时,需要将结构光图片与灰点相机拍摄得到的图片中,找出角点之间的对应性,使用了如下一条代码: Mat HomoMatri ...

  2. 图像处理(三):单应性矩阵

    图像处理(三):单应性矩阵 概念介绍 很多时候我们需要把一张图片"均匀"地扭曲一下.比如说,你有一本书封面的正面照片,现在你想生成这个封面放在桌面上,与你视线有一定夹角的的照片.很 ...

  3. Homography 估计单应性矩阵代码实现

    import cv2 import numpy as np # 读取图片 img1 = cv2.imread('01.jpg') img2 = cv2.imread('02.jpg')# 计算SURF ...

  4. 关于单应性矩阵的理解:Homography matrix for dummies

    尽量写的通俗一点,因为从某种程度上讲,本人也是dummy..... 1. 先说homogeneous coordinate,齐次坐标 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1) ...

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

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

  6. 单应性矩阵的相关理解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zinnc/article/details/52319491 尽量写的通俗一点,因为从某种程度上讲,本 ...

  7. 单应性矩阵的理解及求解1

    https://blog.csdn.net/zinnc/article/details/52319491 尽量写的通俗一点,因为从某种程度上讲,本人也是dummy..... 1. 先说homogene ...

  8. 单应性矩阵的理解及求解3

    http://www.sohu.com/a/223594989_100007727 前面文章<从零开始学习「张氏相机标定法」(一)成像几何模型>中我们已经得到了像素坐标系和世界坐标系下的坐 ...

  9. 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导

    矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...

  10. 单应性矩阵的理解及求解4

    https://blog.csdn.net/hudaliquan/article/details/52121832 网上有很多关于单应性矩阵的求解方法,但都没有说明怎样用四点求解单应性矩阵或者源码详细 ...

最新文章

  1. ansible基本操作
  2. MAS 714总复习
  3. Windows下安装tensorflow-gpu/cpu教程
  4. Maven-学习笔记02【基础-Maven的安装和仓库种类】
  5. 在oracle下我们如何正确的执行数据库恢复
  6. live555源代码简介
  7. 宝塔自助建站系统源码v8.0
  8. 200 多个 npm 包被攻击,Azure 开发者请注意
  9. HDOJ 1720 A+B Coming
  10. 【数据结构和算法笔记】队列(Queue)详解:c实现
  11. 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
  12. java实现Tomasulo算法_并行计算机组成与设计pdf
  13. 随机信号分析学习笔记(1)
  14. Unity3D水下动物模型大集合
  15. 矢量文字符号文件格式设计
  16. 你以为打上马赛克就安全了吗?用Python一键还原,了解一下?
  17. 安卓11:android studio出现:Executing tasks: [:app:assembleDebug] in project D:\Android studio\New start
  18. SAP UI5 应用开发教程之七十九 - 采用测试驱动开发理念(Test Driven Development)进行 SAP UI5 应用的功能开发(一)的试读版
  19. 日志20130104~0308
  20. 后台系统登录一般流程

热门文章

  1. stc15f2k60f2单片机定时器_8 STC15F2K60S2单片机的定时器计数器 例题
  2. TCP、UDP、CoAP、LwM2M、MQTT简单对比
  3. kvaser canking 的使用
  4. PLSQL 官方下载及安装
  5. css设置行高居中,CSS line-height行高上下居中垂直居中样式属性
  6. 淘口令 java,抓包获取淘口令的解决方案
  7. Android提取分区镜像命令,Android取证:使用ADB和DD对文件系统做镜像
  8. mindoc升级总结
  9. 语法分析——自顶向下分析方法
  10. matlab积分器的工作原理,Simulink积分器详解(图)