假设我在将单应变换H应用于某个原始图像后获得了图像。原始图像未显示。应用于原始图像的单应性H的结果是该图像:
我希望将此图像围绕合适的轴旋转30度(可能位于相机的位置,如果有的话),以获得此图像:
如果我不知道相机参数,如何使用python应用此旋转变换?我只能指定我想要旋转图像的度数和我想要旋转的近似轴。另外,如何使用H和旋转变换推导出原始图像(单应性前)和最终旋转图像之间的单应性H'?
答案 0 :(得分:5)
要应用单应性,我建议使用OpenCV,更具体地说是warpPerspective
函数https://docs.opencv.org/3.0-beta/modules/imgproc/doc/geometric_transformations.html#warpperspective
因为我们所说的是纯粹的旋转,没有相机平移,所以你只需使用单应性就可以产生与这种旋转相对应的图像。但要找到作为轴方向和旋转角度函数的单应性参数,您需要知道相机内部参数,主要是焦距。
如果您有相机模型,则可以计算出方程,但获得单应矩阵的另一种方法是计算变换后的目标点坐标,然后使用findHomography
函数。或者你可以找到匹配点,然后计算单应性。
如果您没有相机型号和旋转参数,或两个图像中的匹配点,您无需做任何事情,您需要其中任何一个来找出单应性。您可以尝试猜测相机型号。你究竟有什么信息?
答案 1 :(得分:5)
一个有趣的问题。为了帮助解释我的解决方案,我将定义一些符号:
由于您的相机正在旋转而不进行平移,因此您可以通过使用相应的单应矩阵对图像进行扭曲来合成任何旋转矩阵 R 的虚拟视图。因此,您无需尝试在3D中重建场景以合成这些视图。
现在我假设我们估计 K ,并给出从I1到I3的单应性方程。这回答了问题的最后部分。最后,我会给出一个估计 K 的好方法。然后你就拥有了你所需要的一切
设 p =(px,py)为I1中的2D点。我们使用向量 p =(px,py,1)在齐次坐标中定义此点。同样地,让点 q =(qx,qy,1)成为I3中点 p 的位置。将 p 转换为 q 的单应矩阵 H'由 H' = K R inv( K ) H 。对于您指定的任何 R ,您可以使用它来计算 H'然后您可以使用例如变换I1来合成新视图。 OpenCV的warpPerspective功能。
<强>推导即可。我们首先应用 H 来获得I2点。接下来,我们通过inv( K )将点转换为3Dcaméra坐标中的位置。然后,我们应用旋转 R ,最后使用 K 投影到图像上。如果你不确定如何应用这样的投影变换那么我强烈建议你仔细阅读Hartley和Zisserman的书“多视图几何”。
计算 K 。为此,我提出了一个使用自由女神像的狡猾策略。具体来说,请注意她站在一个平台上,我将假设它是方形的。这是杀手伎俩!现在我们将使用方块进行粗略的相机校准。我将假设没有镜头失真, K 有简化形式, K = [f,0,cx; 0,f,cy; 0,0, 1]。这意味着纵横比为1(通常大致是数码相机的情况),主要点位于图像的中心:cx = w / 2和cy = h / 2其中w和h是宽度和高度分别是图像。试图估计镜头失真和更复杂的 K 矩阵将是非常困难的。镜头失真似乎并不重要,因为木材的边缘在图像中都大致笔直,因此可以忽略。
所以现在我们要计算f。这将使用基于平面的相机校准来完成。着名的参考是张:一种灵活的相机校准新技术,位于https://www.microsoft.com/en-us/research/publication/a-flexible-new-technique-for-camera-calibration/
这样做的方法是先点击雕像平面在I2的四个可见角落的4个角(见附图)。让我们称这些p1 p2 p3和p4,从左下角开始顺时针旋转。然后,您可以使用OpenCV的相机校准方法从这4个角点获得 K 的估计值。重要的是我们能够做到这一点的原因是因为我们知道平台是方形的。为了更深入地了解基于平面的校准,我建议阅读张的论文。如果您遇到困难,我可以在几分钟内自己完成并发送 K 矩阵。
作为最后一点,这种方法的一个细微变化是使用原始图像进行校准(假设您仍然使用它)。原因是 H 可能会扭曲I2,使其纵横比不接近1且主点不在图像中心附近。如果您使用原始图像校准(让我们称之为矩阵 K1 ),那么您将使用 K = H K1