Calculating 3D world point
我是OpenCV的初学者,我想从2D(投影在图像上)中找到3D点,并且知道一个点的三个世界坐标中的两个。
我拥有的:百万千克1校准摄像机(已知:固有参数矩阵、畸变系数矢量)百万千克1百万千克1旋转矢量和平移矢量百万千克1百万千克1(u,v)-图像上点的坐标百万千克1百万千克1一个点的两个已知世界坐标和一个未知世界坐标百万千克1
问题变量1已知:x,y未知:z
问题变量2已知:x,z未知:y
问题变量3已知:Y,Z未知:X
如何找到第三个未知坐标?有可能吗?
- 我假设rotation vector和translation vector是相机姿态,是一种同质变换,允许将世界坐标/帧中的一个点转换为相机坐标/帧。X、Y和Z用世界坐标/帧表示,而不是用摄像机坐标/帧表示。这是正确的吗?
- 如果是这样的话,我认为2和3应该是可能的:用rvec和tvec把rvec和tvec把Z_c用rvec和tvec把u和v用内在参数把X和EDOCX11〔3〕用标准化的相机帧(EDOCX11〔2〕和EDOCX11〔3〕用z把EDOCX11〔2〕或EDOCX11〔3〕乘以z。你应该得到z。你应该得到。X_c或为了得到X_w或Y_w,必须用rvec和tvec乘以逆齐次变换。我不知道1。
- 从畸变、内在和外在,你可以通过像素从相机中心计算出3D射线。如果你跟着那条射线走,你最终会找到一个有你想要的2个坐标值的点,然后你也知道第3个坐标值。
是的,这是可能的。考虑无非线性失真的简单情况。假设ki是相机矩阵的倒数,相机中心位于世界原点(即不旋转或平移)。设p=(u,v,1)为均匀像素坐标。然后通过像素的光线是:
其中,s > 0是一个未知的尺度。但是s * P = [X, Y, Z],所以如果你知道x、y或z中的任何一个,你可以解出s并找到缺少的坐标。
对于非零旋转平移,将ki替换为投影矩阵的逆矩阵。对于非零失真,用完整的重投影方程替换Ki的简单乘法。
- 谢谢你的回复!再问一个问题。在非零旋转平移的情况下,如何将投影矩阵(尺寸3 x 4)的逆矩阵乘以P(尺寸3 x 1)?在这种情况下,p=(u,v,1,1),我说得对吗?
- 你只需要解方程p=s*k*(r*p+t),因此s*p=rt*(ki*p-t),其中rt=inv(r)是相机从世界旋转矩阵的转置,t是相机到世界原点的平移向量。