一、话说透视变换

透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。 
OpenCV中透视变换的又分为两种:

- 稀疏透视变换

- 密集透视变换

我们经常提到的对图像的透视变换都是指密集透视变换,而稀疏透视变换在OpenCV的特征点匹配之后的特征对象区域标识中经常用到。一般情况下密集透视变换warpPerspective函数常与函数getPerspectiveTransform一起使用实现对图像的透视校正。而稀疏透视变换perspectiveTransform经常与findhomography一起使用。

二、原理公式

u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中

变换矩阵可以分作四部分来理解,表示线性变换,表示平移,产生透视,

所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)。

重写之前的变换公式可以得到:

所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能新的变换后的图片。简单的看一个正方形到四边形的变换:

根据变换公式得到:

定义几个辅助变量:

都为0时变换平面与原来是平行的,可以得到:

不为0时,得到

求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形。

三、实验

透视变换的一般过程:读入图片,获取边界点,定义目标边界点,获取转换矩阵,执行转换。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{Mat src = imread("100.jpg");vector<Point2f>src_coners(4);src_coners[0] = Point2f(74, 144);src_coners[1] = Point2f(306, 54);src_coners[2] = Point2f(120, 277);src_coners[3] = Point2f(379, 187);//对四个点画圆点标记circle(src, src_coners[0], 3, Scalar(0, 0, 255), 3, 8);circle(src, src_coners[1], 3, Scalar(0, 0, 255), 3, 8);circle(src, src_coners[2], 3, Scalar(0, 0, 255), 3, 8);circle(src, src_coners[3], 3, Scalar(0, 0, 255), 3, 8);vector<Point2f>dst_coners(4);dst_coners[0] = Point2f(0, 0);dst_coners[1] = Point2f(400, 0);dst_coners[2] = Point2f(0, 300);dst_coners[3] = Point2f(400, 300);Mat warpMatrix = getPerspectiveTransform(src_coners, dst_coners);Mat dst;warpPerspective(src, dst, warpMatrix, dst.size(), INTER_LINEAR, BORDER_CONSTANT);imshow("原图", src);imshow("输出结果", dst);waitKey();return 0;
}

OpenCV:透视变换相关推荐

  1. OpenCV透视变换应用于图像的实例(附完整代码)

    OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 #include "opencv2/imgproc.hpp" #i ...

  2. OpenCV透视变换应用于图像的实例(附完整源代码)

    OpenCV透视变换应用于图像的实例 透视变换应用于图像的实例完整源代码 透视变换应用于图像的实例完整源代码 #include "opencv2/imgproc.hpp" #inc ...

  3. 详解 OpenCV 透视变换原理 及 实例

    OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...

  4. 使用OpenCV透视变换技术实现坐标变换实践

    1. 概述 1.1. 需求 在局部空间(无GPS定位)视频监控过程中,把视频识别到物体位置,投射到空间平面坐标系中,获取物体在局部空间的平面坐标. 1.2. 解决方案 使用图像透视变换技术. 1.3. ...

  5. OpenCV 透视变换 图像拼接

    A:OpenCV 透视变换 一:OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意 ...

  6. opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用

    透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...

  7. OpenCV——透视变换

    透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面,示意图如图所示.透视变换常用于机器人视觉导航研究中,由于相机视场与地面存在倾斜角使得物体成像产生畸变,通常通过透视变换实现对物体 ...

  8. C++ OpenCV透视变换综合练习

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为3879字,预计阅读9分钟 前言 以前的文章<C++ OpenCV之透视变换>介绍过透视变换,当时主要是自己固定的变 ...

  9. OpenCV透视变换示例

    公众号推送看到的 由于深度学习平时训练的是pytorch框架的东西  传统opencv处理图像用的非常少 温故而知新 示例入下图 把这本书矫正 做法是 先缩小图二分之一,高斯模糊+边缘检测+膨胀 去噪 ...

  10. python opencv 透视变换

    可以缩小,不能放大: 只需要4个点坐标就可以了. # -*- coding: utf-8 -*- import os import numpy as np import cv2list_path = ...

最新文章

  1. MySQL必知必会读书笔记
  2. List VS Set
  3. requirements.txt一键安装项目所需要的的python包
  4. Caffe框架详细梳理
  5. ajax 在php中一个运用
  6. 细说业务逻辑(前篇)
  7. 【2022最新Java面试宝典】—— Nginx面试题(23道含答案)
  8. unity游戏框架学习-资源管理
  9. 你真正了解图像金字塔吗?详细介绍拉普拉斯金字塔和高斯金字塔(pyrDown() and pyrUp()),参考《OpenCV轻松入门:面向Python》
  10. Word文档怎么添加删除线
  11. quartz mysql表文件_quartz 持久化 数据库表
  12. Sbo之于中国的使用现状分析
  13. [原创]网上一位叫啊松得网友提供,本人搜集!!
  14. 无需会员将有道云笔记脑图转换xmind
  15. 了解MVC模式与MVC框架
  16. js判断字符超长度中间用...替换
  17. 用Qt开发小游戏《愤怒的小鸟》
  18. 计算机网络:网间互联协议
  19. IBM磁盘阵列配置教程
  20. CKEditor在线编辑器

热门文章

  1. Docker - 安装并持久化PostgreSQL数据
  2. Java描述设计模式(15):责任链模式
  3. hadoop--日志聚集功能的配置
  4. 协议形式化安全分析 Scyther 并非所有协议可以照抄就搬
  5. java基础(一)-面向对象思想
  6. 一个文章表的 MySQL 索引怎么建立合理
  7. uwsgi和nginx的故事
  8. 单例模式(Singleton )的几种用法以及使用条件
  9. Halcon算子翻译——comment
  10. web 信息模糊检索等 Lucene的实现