反透视变换?

时间:2018-08-13 17:01:39

标签: opencv computer-vision projection homography

我正在尝试从给定图像中找到鸟瞰图像。我还具有将其转换为鸟瞰平面所需的旋转和平移(也是固有矩阵)。我的目的是找到一个单应性逆矩阵(3x3)。

rotation_x = np.asarray([[1,0,0,0],
                        [0,np.cos(R_x),-np.sin(R_x),0],
                        [0,np.sin(R_x),np.cos(R_x),0],
                        [0,0,0,1]],np.float32)

translation = np.asarray([[1, 0, 0, 0],
                         [0, 1, 0, 0 ],
                         [0, 0, 1, -t_y/(dp_y * np.sin(R_x))],
                         [0, 0, 0, 1]],np.float32)

intrinsic = np.asarray([[s_x * f / (dp_x  ),0, 0, 0],
                       [0, 1 * f / (dp_y ) ,0, 0 ],
                       [0,0,1,0]],np.float32)

#The Projection matrix to convert the image coordinates to 3-D domain from (x,y,1) to (x,y,0,1); Not sure if this is the right approach
projection = np.asarray([[1, 0, 0],
                        [0, 1, 0],
                        [0, 0, 0],
                        [0, 0, 1]], np.float32)

homography_matrix =  intrinsic @  translation @ rotation  @ projection

inv = cv2.warpPerspective(source_image, homography_matrix,(w,h),flags = cv2.INTER_CUBIC  | cv2.WARP_INVERSE_MAP)

我的问题是,这是正确的方法吗,因为我可以手动设置合适的ty,rx,但不能为所提供的(ty,rx)设置一个合适的方法。

1 个答案:

答案 0 :(得分:5)

第一个前提:您的鸟瞰图仅适用于图像中的一个特定平面,因为单应性只能绘制平面(包括无限远处的平面,对应于纯相机旋转)。

第二个前提:如果您可以在第一张图片中识别出一个四边形,即世界上一个矩形的投影,则可以直接计算将四边形映射到该矩形的单应性(即,“鸟瞰图”四边形),然后使用它对图像进行扭曲,设置比例,以使图像扭曲为所需的尺寸。无需使用相机的内部特性。例如:您拥有一栋带有矩形窗户的建筑物的图像,并且知道了这些窗户在世界上的宽高比。

有时候您找不到矩形,但是您的相机已经过校准,因此,您描述的问题开​​始发挥作用。让我们做数学。假定在给定图像中要观察的平面在世界坐标中为Z=0。假设K是3x3固有摄像机矩阵,而[R, t]是3x4矩阵,表示XYZ世界框架中的摄像机姿势,因此,如果PcPw分别表示相同的3D点在摄像机和世界坐标中,它是Pc = R*Pw + t = [R, t] * [Pw.T, 1].T,其中.T表示转置。然后,您可以将相机投影写为:

s * p = K * [R, t] * [Pw.T, 1].T

其中s是任意比例因子,pPw投射到的像素。但是,如果Pw=[X, Y, Z].TZ=0平面上,则R的第三列只会乘以零,因此我们可以忽略它。如果然后用r1r2来表示R的前两列,则可以将上面的等式重写为:

s * p = K * [r1, r2, t] * [X, Y, 1].T

但是K * [r1, r2, t]是一个3x3矩阵,它将3D平面上的点转换为相机平面上的点,因此它是单应性。

如果平面不是Z = 0,则可以重复相同的参数,将[R,t]替换为[R,t] * inv([Rp,tp]),其中[Rp,tp]是坐标变换将平面上的框架(法线为Z轴)映射到世界框架。

最后,要获得鸟瞰图,请选择旋转R,其第三列(相机框架中世界Z轴的分量)与平面法线相反。