numpy 如何使用单应性将两个相机FOV转换为一个显示图像

x759pob2  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在做一个项目,我必须用鸟瞰的非重叠视角从两个摄像头检测物体(铁路上的小车)(见下图)

如您所见,检测到汽车并返回其质心坐标。
然而,我试图将这两个视图转换为一个仅表示汽车行驶的铁路的图像。

因此,为了模拟,我创建了只有铁路的目的Map像(上图中的黑色轨迹),如下所示:

在做了一些研究之后,我使用了一种来自OpenCV的方法,称为:cv2.findHomography(),它可以找到两个平面之间的单应矩阵。
来自两个摄像头的两幅图像分别具有1280x720的分辨率。目标画面的分辨率为1440x480。
我的代码编写如下:

import numpy as np
import cv2

def Perspective_transf(src_point,h):
 a = np.array([src_point]) 
 a=np.array(a.transpose())
 a=np.vstack((a,np.array(1)))
 a_transformed_homo = np.dot(h,a)
 scale_factor=a_transformed_homo[2][0]
 a_transformed_euk=np.divide(a_transformed_homo,scale_factor)
 return a_transformed_euk

# Source points: from camera image which are the same as the two cameras have the same resolution

pts_src=np.array([[0,0],[1280,0],[720,1280],[0,720],[640,360]])

# destination correspondences of the pts_src on the destination image (for camera 1)

pts_dst1=np.array([[0,0],[720,0],[720,480],[0,480],[360,240]])

# destination correspondences of the pts_src on the destination image (for camera2)

pts_dst2=np.array( [[720,0],[1440,0],[1440,480],[720,480],[1080,240]])

# homography between the first camera image plane and the destination image

h1, status1 = cv2.findHomography(pts_src, pts_dst1)

# homography between the second camera image plane and the destination image

h2, status1 = cv2.findHomography(pts_src, pts_dst2)

在此之后,我估计了单应点,对于每个检测到的质心,我可以使用单应点将其投影(变换)到目标图像上。
当我运行我的代码时,我得到以下结果:

正如您可以看到的,通过将检测到的汽车质心从一个相机视野转换到另一个相机视野而创建的轨迹与模拟铁路的定义轨迹不对齐,并且与图像相比旋转。
那么,我到底做错了什么,为什么我的结果会是这样呢?
提前谢谢你
哈立德·贾巴利

swvgeqrz

swvgeqrz1#

我只是加了两个点就解开了。这样,反投影误差就最小化了。

相关问题