对于以下问题,我非常感谢您的帮助:
已从校准的立体装置中捕获并校正灰度图像。我现在正试图在左侧图像中获取特定点相对于左侧相机的真实世界 x,y,z 坐标;我正在尝试使用 cvPerspectiveTransform 来做到这一点。
我的缩写代码如下。
该代码似乎在某种程度上有效,并返回以下 4 个数据点:(15.4510、-474.7451、-527.0327、-912.6536),我理解它们代表 x、y、z 和 w。
问题1)这个假设正确吗?- 可能已经发生了除以 w 并且 XYZ 已经返回,在这种情况下 -912.6536 是一个可以忽略的人工制品 - 欢迎对此提出任何意见。
问题2)但是,如果要实现真实世界坐标X,Y,Z,'x','y','z'中的每一个分别除以'w',得到的XYZ坐标的单位是什么?我理解它们与校准中使用的“点”有关 - 在这种情况下,棋盘角相距 2.5 厘米,但在这种情况下,与物体相机的距离约为 60 厘米......如你所见,数学没有不太行。
我已经认真阅读了布拉德斯基书中的相关页面(并在网上搜索过),但我一定遗漏了一些东西。
Matrix<float> inputMatLeft = new Matrix<float>(4,1,3);
inputMatLeft[0,0] = xL; // xL, a float, the x coord of a point in the left image
inputMatLeft[1,0] = yL; // yL, a float, the y coord of same point in left image
inputMatLeft[2,0] = d; // d, a float, the disparity between the same featurepoint in the left and right rectified images, is calc'd and defined elsewhere
inputMatLeft[3,0] = 1F;
Matrix<float> rwCoords = new Matrix<float>(4,1,3);
rwCoords = computeRealWorldCoords(inputMatLeft);
// ....do stuff with rwCoords
public Matrix<float> computeRealWorldCoords(Matrix <float> leftSrc)
{
Matrix<float> leftDest = new Matrix<float>(4,1,3);
CvInvoke.cvPerspectiveTransform(leftSrc, leftDest, inputMatrixQ); // Q Matrix is 4x4 float
return leftDest;
}
谢谢!