Rav*_*310 9 python image image-processing computer-vision homography
假设我将单应变换H应用于某个原始图像后得到的图像.原始图像未显示.将单应性H应用于原始图像的结果是此图像:
我想将这个图像围绕一个合适的轴旋转30度(可能是相机所在的位置,如果有的话)来获得这个图像:
如果我不知道相机参数,如何使用python应用此旋转变换?我只能指定我想要旋转图像的度数和我想要旋转的近似轴.另外,如何使用H和旋转变换推导原始图像(单应性之前)和最终旋转图像之间的单应性H'?
为了应用单应性,我建议使用OpenCV,更具体地说是warpPerspective函数https://docs.opencv.org/3.0-beta/modules/imgproc/doc/geometric_transformations.html#warperspective
因为我们谈论的是纯粹的旋转,没有相机平移,所以你可以通过使用单应性来生成与此旋转相对应的图像.但要找到作为轴方向和旋转角度函数的单应性参数,您需要知道相机内部参数,主要是焦距.
如果您有相机模型,您可以计算出方程,但获得单应矩阵的另一种方法是计算变换后的目标点坐标,然后使用该findHomography函数.或者您可以找到匹配点,然后计算单应性.
如果您没有相机模型和旋转参数,或两个图像中的匹配点,则无法执行任何操作,您需要其中任何一个来查找单应性.您可以尝试猜测相机型号.你有什么信息?
一个有趣的问题.为了帮助解释我的解决方案,我将定义一些符号:
由于您的相机正在旋转而不进行平移,因此您可以通过使用相应的单应矩阵对图像进行扭曲来合成任何旋转矩阵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'然后您可以使用例如OpenCV的warpPerspective函数来扭曲I1以合成新视图.
推导.我们首先应用H来得到I2的观点.接下来,我们通过inv(K)将点转换为3Dcaméra坐标中的位置.然后我们应用旋转R并最终用K投射到图像上.如果您不确定如何应用这样的投影变换那么我强烈建议您仔细阅读Hartley和Zisserman的书"多视图几何".
计算 ķ.为此,我提出了一个使用自由女神像的狡猾策略.具体来说,请注意她站在一个平台上,我将假设它是方形的.这是杀手伎俩!现在我们将使用方块进行粗略的相机校准.我将假设没有镜头失真,K简化了形式,K = [f,0,cx; 0,f,cy; 0,0,1].这意味着纵横比为1(通常大致是数码相机的情况),主要点位于图像的中心:cx = w/2和cy = h/2其中w和h是宽度和高度分别是图像.试图估计镜头失真和更复杂的K矩阵将是非常困难的.镜头失真似乎并不重要,因为木材的边缘在图像中都大致笔直,因此可以忽略.
所以现在我们要计算f.这将使用基于平面的相机校准来完成.着名的参考文献是Zhang:一种灵活的相机校准新技术,位于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.