【发布时间】:2015-01-27 21:32:25
【问题描述】:
我有一个 3D 世界,我正在尝试使用 cv2.projectPoints 将其映射到 2D 视图,但它并没有像我预期的那样运行。我对 opencv、numpy 和矩阵运算的掌握很弱,所以我一定是在某个地方做出了错误的假设。这段代码:
src = np.ones((6, 3))
src[:,1] = 2
src[:,2] = range(6) # source points
rvec = np.array([0,0,0], np.float) # rotation vector
tvec = np.array([0,0,0], np.float) # translation vector
fx = fy = 1.0
cx = cy = 0.0
cameraMatrix = np.array([[fx,0,cx],[0,fy,cy],[0,0,1]])
result = cv2.projectPoints(src, rvec, tvec, cameraMatrix, None)
for n in range(len(src)):
print src[n], '==>', result[0][n]
产生这个输出:
[ 1. 2. 0.] ==> [[ 1. 2.]]
[ 1. 2. 1.] ==> [[ 1. 2.]]
[ 1. 2. 2.] ==> [[ 0.5 1. ]]
[ 1. 2. 3.] ==> [[ 0.33333333 0.66666667]]
[ 1. 2. 4.] ==> [[ 0.25 0.5 ]]
[ 1. 2. 5.] ==> [[ 0.2 0.4]]
x 值和 y 值除以 z 值?!我认为由于我没有对 rvec 和 tvec 应用任何转换,因此输出应该与 src 的 [x,y] 值匹配。
【问题讨论】:
-
这是正确的行为。随着 src 点远离相机针孔,它们被投影到更靠近原点的图像点。更远的物体在图像中看起来更小。换句话说,对象大小与距离成反比。来自 src 点 (x,y,z) 的图像点 (x',y') 的方程写在此 url openCV doc 的文档中