【发布时间】:2021-05-21 22:22:42
【问题描述】:
所以设置如下所示的坐标系,其中z轴指向屏幕外(朝向您),相机焦距为270像素,图像分辨率为640x480,然后我们在 3D 空间某处有一个物体,两架无人机d1 和d2 在两个不同的视点进行两次观察,其中d1 在(6, 3, 2) 处,该物体对应的图像坐标为(320, 280),并且d2 的标题是(9.5, 4.5, 3) 和(160, 408),d1 的标题是-20 度从y 轴和d2 的标题是+30 度从y 轴,目标是确定(x, y, z)对象所在的位置,无人机正在xy平面上空盘旋
Click Here for Image Illustration
给定信息,通过让d1作为参考系,我们可以得到相机内在函数K = [[270, 0, 320], [0, 270, 240], [0, 0, 1]],变换是旋转+50度,z-axis作为旋转轴,平移@987654345 @,因此是我的代码
import numpy as np
import cv2
def pixel2cam(pt, K):
u = (pt[0] - K[0][2]) / K[0][0]
v = (pt[1] - K[1][2]) / K[1][1]
return np.array([u, v], dtype=np.float32)
def triangulate(points_1, points_2, K, R, t):
cam_pts_1 = pixel2cam(points_1, K).reshape(2, 1)
cam_pts_2 = pixel2cam(points_2, K).reshape(2, 1)
T1 = np.array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]], dtype=np.float32)
T2 = np.hstack((R, t))
X = cv2.triangulatePoints(T1, T2, cam_pts_1, cam_pts_2)
X /= X[3]
return X
K = np.array([[270, 0, 320], [0, 270, 240], [0, 0, 1]], dtype=np.float32)
# rotate +50 degrees along z axis
R = np.array([[0.643, -0.766, 0], [0.766, 0.643, 0], [0, 0, 1]], dtype=np.float32)
t = np.array([[3.5], [1.5], [1]], dtype=np.float)
pt_1 = (320, 280)
pt_2 = (160, 408)
X = triangulate(pt_1, pt_2, K, R, t)
这会给你一个齐次坐标X = [[-2.4155867], [ -5.1455526], [-12.032189], [1.]]),其中z 是负数,所以我的问题是
- 我在这里正确表述了
R和t吗? - 如果是,那么错误可能是由于此处使用的相机坐标系与
OpenCV中使用的相机坐标系不同?
感谢任何帮助!
【问题讨论】:
标签: python opencv image-processing computer-vision triangulation