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

Posted 肖永威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OpenCV透视变换技术实现坐标变换实践相关的知识,希望对你有一定的参考价值。

1. 概述

1.1. 需求

在局部空间(无GPS定位)视频监控过程中,把视频识别到物体位置,投射到空间平面坐标系中,获取物体在局部空间的平面坐标。

1.2. 解决方案

使用图像透视变换技术。

1.3. 透视变换概念

透视变换是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简而言之,就是将一个平面通过一个投影矩阵投影到指定平面上。

透视变换(Perspective Transform)和仿射变换(Affine Transform)在图像还原、局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用比较多;在3D平面中,透视变换占领地位较高。两种变换原理相似,结果也相似,可以针对不同场合选择适合方法。

2. 透视变换原理

透视变换:
( x y z ) = ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) ( u v 1 ) \\beginpmatrix x\\\\ y\\\\ z \\endpmatrix = \\beginpmatrix a_11 & a_12 & a_13 \\\\ a_21 & a_22 & a_23 \\\\ a_31 & a_32 & a_33 \\endpmatrix \\beginpmatrix u\\\\ v\\\\ 1 \\endpmatrix xyz = a11a21a31a12a22a32a13a23a33 uv1
上述公式中, u , v u,v u,v代表原始图像坐标, x , y x,y x,y为经过透视变换的图片坐标,其中变换矩阵为 3 × 3 3\\times3 3×3形式。进而可以得到:

x = a 11 u + a 12 v + a 13 x=a_11u + a_12 v+ a_13 x=a11u+a12v+a13
y = a 21 u + a 22 v + a 23 y=a_21u + a_22 v+ a_23 y=a21u+a22v+a23
z = a 31 u + a 32 v + a 33 z=a_31u + a_32 v + a_33 z=a31u+a32v+a33

在原图上取4点坐标与新图对应,相当于列出方程组,解出变换矩阵。
通过变换矩阵,在输入原图像坐标的情况下,可以直接求解新图平面坐标。
x ′ = x z = a 11 u + a 12 v + a 13 a 31 u + a 32 v + a 33 x' = \\fracxz = \\fraca_11u + a_12 v+ a_13a_31u + a_32 v + a_33 x=zx=a31u+a32v+a33a11u+a12v+a13
y ′ = y z = a 21 u + a 22 v + a 23 a 31 u + a 32 v + a 33 y' = \\fracyz = \\fraca_21u + a_22 v+ a_23a_31u + a_32 v + a_33 y=zy=a31u+a32v+a33a21u+a22v+a23

其中, ( x , y ) (x,y) (x,y)是原图坐标, ( x ’ , y ’ ) (x’,y’) (x,y)是变换后的坐标; a 11 , a 12 , a 21 , a 22 , a 31 , a 32 a_11,a_12,a_21,a_22,a_31,a_32 a11,a12,a21,a22,a31,a32为旋转量, a 13 , a 23 , a 33 a_13,a_23,a_33 a13,a23,a33为平移量。因为透视变换是非线性的,所以不能齐次性表示;透视变换矩阵为 3 × 3 3\\times3 3×3

透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。

3. OpenCV透视变换

3.1. 关于OpenCV透视变换函数

投影变换(Projective mapping)也称透视变换(Perspective transformation)是建立两平面场之间的对应关系, 将图片投影到一个新的视平面(Viewing plane)。

OpenCV 提供了 cv2.warpPerspective 函数实现投影变换的操作。

函数说明:

cv2.getPerspectiveTransform(src, dst[,solveMethod]) → MP
cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
  • 函数cv2.getPerspectiveTransform 根据图像中不共线的 4 个点在变换前后的对应位置求得 ( 3 × 3 3\\times3 3×3) 变换矩阵
  • 函数cv2.warpPerspective 使用该 ( 3 × 3 3\\times3 3×3) 变换矩阵即可求出变换后的图像。标量进行加法运算。

参数说明:

  • src:变换前图像四边形顶点坐标
  • dst:变换后图像四边形顶点坐标
  • solveMethod:矩阵分解方法,传递给 cv2.solve 求解变换矩阵 MP
  • cv2.DECOMP_LU:选择最优轴的高斯消去法,默认方法
  • cv2.DECOMP_SVD:奇异值分解(SVD)方法
  • cv2.DECOMP_EIG:特征值分解方法,src 必须对称
  • cv2.DECOMP_QR:QR(正交三角)分解
  • cv2.DECOMP_CHOLESKY:Cholesky LLT 分解
  • MP:透视变换矩阵,3行3列
  • dsize: 输出图像的大小,二元元组 (width, height)
  • dst:变换操作的输出图像,可选项
  • flags:插值方法,整型(int),可选项
  • cv2.INTER_LINEAR:线性插值,默认选项
  • cv2.INTER_NEAREST:最近邻插值
  • cv2.INTER_AREA:区域插值
  • cv2.INTER_CUBIC:三次样条插值
  • cv2.INTER_LANCZOS4:Lanczos 插值
  • borderMode:边界像素方法,整型(int),可选项,默认值为 cv2.BORDER_REFLECT
  • borderValue:边界填充模式,可选项,默认值为 0(黑色填充)
  • 返回值:dst,透视变换操作的输出图像,ndarray 多维数组

3.2. 透视变换实践设计

为了便于坐标转换,先设定图片像素为坐标,第一步,由图1的标准图,经透视变换为图2,相当于3维空间中某个视角获取到的图像;第二步,再由图2(相当于实际情况下,视频某个空间视角获得的图像)复原,恢复到图3,过程中产生变换矩阵,以此计算新的坐标。
以上是关于使用OpenCV透视变换技术实现坐标变换实践的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenCV中的透视变换介绍

OpenCV图像变换(仿射变换与透视变换)

python-opencv几何变换--仿射变换透视变换

图像处理之_仿射变换与透视变换

OpenGLES 透视变换与屏幕UV坐标