前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像处理之理解Homography matrix(单应性矩阵)

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

作者头像
OpenCV学堂
发布2018-04-04 11:04:33
35.6K0
发布2018-04-04 11:04:33
举报

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

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

单应性矩阵概念

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

  • 一是表述真实世界中一个平面与对应它图像的透视变换
  • 二是从通过透视变换实现图像从一种视图变换到另外一种视图

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

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

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

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

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

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

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

应用案例

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

时代广场的街拍

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

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

实现代码如下:

代码语言:javascript
复制
#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace cv;using namespace std;int main(int argc, char** argv) {    // load images    Mat src = imread("D:/vcprojects/images/times-square.jpg");    if (!src.data) {        printf("could not load image...\n");        return -1;    }    // show images    namedWindow("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 mask    Mat 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 mask     Mat 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 together    Mat result;    add(result1, result2, result);    imshow("Final Result", result);    imwrite("D:/vcprojects/images/result.png", result);    waitKey(0);    return 0;}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图像处理之理解Homography matrix(单应性矩阵)
    • 单应性矩阵概念
      • 应用案例
      相关产品与服务
      图像处理
      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档