我在video(或图像)中有4个共面点,代表一个四边形(不一定是正方形或矩形),我希望能够在其上方显示一个虚拟立方体,其中立方体angular落正好位于angular落的video四。 由于点是共面的,我可以计算单位正方形(即[0,0] [0,1] [1,0] [1,1])的angular点和四边形的video坐标之间的单应性。 从这个单应性我应该能够计算一个正确的相机姿态,即[R | t]其中R是一个3×3的旋转matrix,t是一个3×1的平移vector,以便虚拟立方体位于video四边形上。 我已经阅读了很多解决scheme(其中一些是关于SO的),并试图实现它们,但是它们似乎只能在一些“简单”的情况下工作(比如当video四边形是正方形时),但在大多数情况下不起作用。 这里是我尝试的方法(大多数是基于相同的原则,只有翻译的计算略有不同)。 设K是相机的固有matrix,H是单应matrix。 我们计算: A = K-1 * H 令a1,a2,a3为A的列向量,r1,r2,r3为旋转matrixR的列向量。 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,非常感谢您的回答,我尝试了您的方法(以及其他许多方面),这似乎是或多或less的好。 不过,我在计算基于4个共面点的姿势时仍然碰到一些问题。 为了检查结果,我将它与solvePnP的结果进行了比较(由于迭代重投影误差最小化方法,结果会好得多)。 这里是一个例子: 黄色立方体:解决PNP 黑魔方:Jav_Rock的技术 […]