我在视频(或图像)中有 4 个共面点,代表一个四边形(不一定是正方形或矩形),我希望能够在它们上面显示一个虚拟立方体,其中立方体的角正好位于角上的视频四边形。
由于这些点是共面的,我可以计算单位正方形的角(即 [0,0] [0,1] [1,0] [1,1])和四边形的视频坐标之间的单应性。
根据这个单应性,我应该能够计算出正确的相机位姿,即 [R|t],其中 R 是 3x3 旋转矩阵,t 是 3x1 平移向量,因此虚拟立方体位于视频四边形上。
我已经阅读了许多解决方案(其中一些在 SO 上)并尝试实现它们,但它们似乎只适用于一些“简单”的情况(比如视频四边形是正方形时),但在大多数情况下不起作用。
以下是我尝试过的方法(大部分都是基于相同的原理,只是翻译的计算略有不同)。令 K 为来自相机的内在矩阵,H 为单应矩阵。我们计算:
A = K-1 * H
令 a1,a2,a3 为 A 的列向量,r1,r2,r3 为旋转矩阵 R 的列向量。
r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)
问题是这在大多数情况下不起作用。为了检查我的结果,我将 R 和 t 与 OpenCV 的 solvePnP 方法(使用以下 3D 点 [0,0,0] [0,1,0] [1,0,0] [1,1 ,0])。
由于我以相同的方式显示立方体,我注意到在每种情况下 solvePnP 都提供了正确的结果,而从单应性获得的姿势大多是错误的。
理论上,由于我的点是共面的,因此可以从单应性计算姿势,但我找不到从 H 计算姿势的正确方法。
关于我做错了什么的任何见解?
尝试@Jav_Rock 的方法后编辑
嗨 Jav_Rock,非常感谢您的回答,我尝试了您的方法(以及许多其他方法),这似乎或多或少都可以。尽管如此,在基于 4 个共面点计算姿势时,我仍然碰巧遇到了一些问题。为了检查结果,我与 solvePnP 的结果进行了比较(由于迭代重投影误差最小化方法,这会好得多)。
这是一个例子:
- 黄色方块:解决 PNP
- Black Cube:Jav_Rock 的技术
- 青色(和紫色)立方体:给出完全相同结果的其他一些技术
如您所见,黑色立方体或多或少还可以,但看起来比例不太好,尽管向量看起来是正交的。
EDIT2:我在计算 v3 之后对其进行了归一化(为了强制正交性),它似乎也解决了一些问题。