提取相机的坐标

时间:2015-06-16 08:20:50

标签: c++ opencv computer-vision

我正在尝试提取相机检测到的物体的真实世界坐标。我有相机矩阵和失真矩阵。由于我有x,y(图像中物体的坐标),我尝试求解(X,Y)以获得相对于相机的物体坐标。 (Z = 0,因为我知道放置物体的平面。)

enter image description here

然而,这种方法似乎有问题。我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

你说有问题的3D点的Z世界坐标已知为零。我假设您的世界坐标系与摄像机坐标系不同,否则您的点将位于传感器平面后面,我们就完成了。因此,您必须(可能是校准程序的结果)从世界帧到相机的坐标变换,表示为3x4矩阵Q = [R | t],以便该平面上的世界点投射到图像中:

[x, y, w]' = K * Q * [X, Y, Z, 1]'

其中"'"意思是换位。

用Qi表示从相机帧到世界帧的逆坐标变换:

Qi = inv(Q) = [R' | (-R' * t)] 

使用这个矩阵,我们可以用世界坐标编写摄像机中心:

c_w = Qi * [0, 0, 0, 1]'

图像平面上的像素是世界点的图像:

i_w = Qi * Ki * [x, y, 1]'

其中Ki = inv(K)是相机矩阵的倒数。

从相机中心通过该像素的光线上的所有点都具有世界坐标:

r_w = c_w + lambda * (i_w - c_w)

其中lambda是正数。

您正在寻找这样一条光线上的特定点,即Z = 0平面上的光线。因此,如果在(X,Y,Z)分量中写出最后一个等式,并用0代替Z,则在未知数X,Y和λ中得到3个等式的线性系统。解决它,你得到你的答案。

答案 1 :(得分:-1)

问题是你得到的是按比例调整的坐标。远处的大物体与附近的小物体具有相同的图像。

您需要应用有关对象的一些外部信息才能缩放坐标。它可以是关于对象的一些信息(例如其大小),也可以是使用立体相机或其他RGBD相机。