繁体   English   中英

从旋转或方向矩阵中获取单应矩阵

[英]Get homography matrix from rotation or orientation matrix

我正在使用 android 设备中的传感器获取旋转矩阵和方向(欧拉角)。 我想在 opencv 中使用这些进行仿射变换。 仿射变换使用单应矩阵来完成它的工作。 我的问题是如何将旋转矩阵或方向数组转换为可用于仿射变换的单应矩阵?

Android 代码获取旋转矩阵和方向:

final float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading);

final float[] orientationAngles = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationAngles);

opencv 仿射变换代码

homographtMatrix = ... # to calc from rotation matrix or orientation angls
warped = cv2.warpPerspective(img, homographtMatrix, (cols, 600))

样本旋转矩阵:

[
    [-0.39098227, -0.24775778, 0.8864249], 
    [0.9200034, -0.07699536, 0.38427263], 
    [-0.026955934, 0.96575755, 0.2580418]
]

样本欧拉角:

[1.3097044  0.0269592  1.97264932]

图像进行仿射变换:

瓷砖

所需的变换(从左边剪切没关系,我可以修复它):

在此处输入图像描述

然后我将在分段图像中平铺地板。

单应矩阵是将世界上的一个点 3d (Pw) 投影到图像平面中的一个点 (Px) 的矩阵。 例如:

Px = H . Pw

这可以通过原始方程来完成:

Px = K . (R . Pw + t)

其中 K 是相机内在参数 function,它由一个称为焦距 (f) 长度的数字和一个称为主点 (c) 的点创建,该点大部分时间都是图像的中心。

K = [
      [f, 0, cx],
      [0, f, cy],
      [0, 0, 1 ],
]

而 R 是一个 3d旋转矩阵 为了解释这一点,我们假设世界上的点 z = 0(位于 z 平面上)。 要将其移动到相机坐标,应使用旋转矩阵。 z = 0 导致删除 R 矩阵的列。 K 的组合,去掉一列 R ant t 即点坐标到相机坐标的距离称为单应矩阵。

TL;博士

数学概念很难理解。 我从 github 找到了一个相机校准的实现,它使投影变得容易:

import cv2
from vcam import vcam, meshGen

img = cv2.imread("chess.png")

c1.focus = 390
c1.sx = 101/100
c1.sy = 101/100
c1.KpCoeff[0] = 0
c1.KpCoeff[1] = 0
c1.KpCoeff[2] = 0
c1.KpCoeff[3] = 0

c1.set_tvec(0, 0, -500)
c1.set_rvec(0, 0, -180)

pts2d = c1.project(pts3d)
map_x, map_y = c1.getMaps(pts2d)
output = cv2.remap(img, map_x, map_y, interpolation=cv2.INTER_LINEAR)

它有一个有趣的 GUI 来测试参数如何影响 output。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM