我在视频(或图像)中有4个共面点,代表一个四边形(不一定是正方形或矩形),我希望能够在它们上面显示一个虚拟立方体,其中立方体的角落正好位于视频四边形的角落。
由于这些点是共面的,我可以计算出单位正方形的角落(即[0,0] [0,1] [1,0] [1,1])和四边形视频坐标之间的单应性。
从这个单应性中,我应该能够计算出正确的相机姿态,即[R|t],其中R是3x3旋转矩阵,t是3x1平移向量,使得虚拟立方体位于视频四边形上。
我已经阅读了许多解决方案(其中一些在SO上),并尝试实现它们,但它们似乎只适用于一些“简单”的情况(例如当视频四边形为正方形时),但在大多数情况下不起作用。
以下是我尝试过的方法(它们大多基于相同的原则,只是平移的计算略有不同)。设K为相机的内部矩阵,H为单应性。我们计算:
问题在于大多数情况下这种方法不起作用。为了检查我的结果,我将R和t与OpenCV的solvePnP方法得到的结果进行比较(使用以下三维点[0,0,0] [0,1,0] [1,0,0] [1,1,0])。
由于我以相同的方式显示立方体,我注意到在每种情况下,solvePnP提供正确的结果,而从单应性中获得的姿态大多数情况下是错误的。
理论上,由于我的点共面,可以从单应性计算出姿态,但我找不到从H计算姿态的正确方法。
您对我做错的事情有任何见解吗?
尝试@Jav_Rock的方法后编辑
嗨Jav_Rock,非常感谢您的答案,我尝试了您的方法(以及其他许多方法),似乎更或多或少地可以接受。然而,当基于4个共面点计算姿态时,我仍然遇到一些问题。为了检查结果,我将其与solvePnP的结果进行比较(由于迭代重投影误差最小化方法,后者将更好)。
以下是一个例子:
由于这些点是共面的,我可以计算出单位正方形的角落(即[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方法得到的结果进行比较(使用以下三维点[0,0,0] [0,1,0] [1,0,0] [1,1,0])。
由于我以相同的方式显示立方体,我注意到在每种情况下,solvePnP提供正确的结果,而从单应性中获得的姿态大多数情况下是错误的。
理论上,由于我的点共面,可以从单应性计算出姿态,但我找不到从H计算姿态的正确方法。
您对我做错的事情有任何见解吗?
尝试@Jav_Rock的方法后编辑
嗨Jav_Rock,非常感谢您的答案,我尝试了您的方法(以及其他许多方法),似乎更或多或少地可以接受。然而,当基于4个共面点计算姿态时,我仍然遇到一些问题。为了检查结果,我将其与solvePnP的结果进行比较(由于迭代重投影误差最小化方法,后者将更好)。
以下是一个例子:
- 黄色立方体:解决PNP
- 黑色立方体:Jav_Rock的技术
- 青色(和紫色)立方体:一些其他技术可以得到完全相同的结果
正如您所看到的,黑色立方体或多或少还好,但似乎比例不正确,尽管向量似乎是正交的。
编辑2:在计算v3后,我对其进行了归一化(以强制正交性),它似乎也解决了一些问题。
cameraPoseFromHomography
?H参数和姿态参数是什么?如何像问题中的图像一样绘制一个立方体?请帮帮我,因为我不知道该怎么做!问候- Jonas(您可以在此处找到问题:https://stackoverflow.com/questions/51009968/how-to-draw-cube-c) - user3596335