如何使用单应性将两个相机 FOV 转换为一个显示图像
How to transform two camera FOVs onto one displaying image using homography
我正在做一个项目,我必须从两个鸟瞰图不重叠的摄像头检测物体(铁路上的小型汽车)(见下图)
如您所见,检测到了汽车并返回了它们的质心坐标。
但是,我正在尝试将两个视图转换为一个图像,该图像仅代表汽车行驶的铁路。
因此为了模拟,我创建了只有铁路的目的地图像(如上图所示的黑色轨迹)如下:
在做了一些研究之后,我通过 openCV 中的一种方法登陆:cv2.findHomography()
whcih 找到两个平面之间的单应矩阵。
来自两个摄像头的两张图像分别具有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)
现在,我估计了同形异义词,对于每个检测到的质心,我可以使用同义异义词将其投影(转换)到目标图像上。
当我 运行 我的代码时,我得到以下结果:
如您所见,通过将检测到的汽车行驶质心从一个摄像机视野转换到另一个摄像机视野而创建的轨迹与模拟铁路的定义轨迹不对齐,并且与图像相比发生了旋转。
那么我做错了什么以及为什么我的结果看起来像这样?
提前致谢
哈立德·贾拜里
我只是通过添加更多的点来解决它。这样 back-projection 错误被最小化。
我正在做一个项目,我必须从两个鸟瞰图不重叠的摄像头检测物体(铁路上的小型汽车)(见下图)
如您所见,检测到了汽车并返回了它们的质心坐标。
但是,我正在尝试将两个视图转换为一个图像,该图像仅代表汽车行驶的铁路。
因此为了模拟,我创建了只有铁路的目的地图像(如上图所示的黑色轨迹)如下:
在做了一些研究之后,我通过 openCV 中的一种方法登陆:cv2.findHomography()
whcih 找到两个平面之间的单应矩阵。
来自两个摄像头的两张图像分别具有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)
现在,我估计了同形异义词,对于每个检测到的质心,我可以使用同义异义词将其投影(转换)到目标图像上。
当我 运行 我的代码时,我得到以下结果:
如您所见,通过将检测到的汽车行驶质心从一个摄像机视野转换到另一个摄像机视野而创建的轨迹与模拟铁路的定义轨迹不对齐,并且与图像相比发生了旋转。
那么我做错了什么以及为什么我的结果看起来像这样?
提前致谢
哈立德·贾拜里
我只是通过添加更多的点来解决它。这样 back-projection 错误被最小化。