我正在 opencv 中做一个项目,以使用立体校准检测盲人路径中的障碍物。我已经正确计算了视差图。现在要找到障碍物与相机的距离,我想要它的 3D 坐标 [X,Y,Z] ,我猜它可以通过 reprojectImageTo3D() 找到,但我没有在这个函数中使用的 Q 矩阵,因为我从 stereoRectify() 获得的 Q 矩阵即将变为空,可能是因为我使用了预校准的图像。虽然我确实有我的相机的内在和外在参数。所以我的问题是,如果我知道焦距、基线和关于我的相机的所有其他信息,我如何手动创建 Q 矩阵以直接在函数 reprojectImageTo3D() 中使用?Q矩阵的基本格式是什么?
问问题
21522 次
2 回答
23
Q矩阵的形式如下:
在该图像中,c x和c y是左相机中主点的坐标(如果您使用左相机主导进行立体匹配),c' x是右相机中主点的 x 坐标(c x和c' x 如果您为 指定了标志,则 c x 和c' x将相同,f是焦距,T x是基线长度(可能是基线长度的负数,它是从一个光学中心到另一个 I思考)。CV_CALIB_ZERO_DISPARITY
stereoRectify()
我建议看一下Learning OpenCV这本书以获取更多信息。它仍然基于较旧的 C 接口,但很好地解释了基础理论,并且是我从中获取 Q 矩阵形式的地方。
于 2015-02-04T09:29:48.227 回答
5
如果要直接创建 Q 矩阵:
cv::Mat Q;
Q.at<double>(0,0)=1.0;
Q.at<double>(0,1)=0.0;
Q.at<double>(0,2)=0.0;
Q.at<double>(0,3)=-160; //cx
Q.at<double>(1,0)=0.0;
Q.at<double>(1,1)=1.0;
Q.at<double>(1,2)=0.0;
Q.at<double>(1,3)=-120; //cy
Q.at<double>(2,0)=0.0;
Q.at<double>(2,1)=0.0;
Q.at<double>(2,2)=0.0;
Q.at<double>(2,3)=348.087; //Focal
Q.at<double>(3,0)=0.0;
Q.at<double>(3,1)=0.0;
Q.at<double>(3,2)=1.0/95; //1.0/BaseLine
Q.at<double>(3,3)=0.0; //cx - cx'
但是您应该校准两个相机,然后从 cv::stereoRectify 获取 Q 矩阵。请注意,将 Q 矩阵读取为双精度值。
于 2015-07-02T14:47:38.170 回答