我正在opencv做一个项目来检测使用立体声校准的盲人路径中的障碍物。我已经正确地计算了视差图。现在要找到障碍物距离相机的距离,我想要它的3D坐标[X,Y,Z],我猜是可以通过reprojectImageTo3D()找到,但我没有Q矩阵在这个函数中使用,因为我从stereoRectify()获得的Q矩阵可能因为我使用预校准图像而变为零。虽然我确实拥有相机的内在和外在参数。 所以我的问题是,如果我知道焦距,基线以及我相机的其他所有内容,如何手动创建Q矩阵以直接在函数reprojectImageTo3D()中使用? Q矩阵的基本格式是什么?
答案 0 :(得分:14)
Q矩阵的形式如下:
在该图像中, c x 和 c y 是左侧主点的坐标相机(如果您使用左相机占优势进行立体匹配), c' x 是右相机中主点的x坐标( c <如果为CV_CALIB_ZERO_DISPARITY
指定了stereoRectify()
标志,则sub> x 和 c' x 将是相同的, f 是焦距, T x 是基线长度(可能是基线长度的负值,它是来自一个光学中心的平移另一方面我认为。)
我建议您查看一下这本书Learning OpenCV以获取更多信息。它仍然基于较旧的C接口,但很好地解释了基础理论,并且是我从中获取Q矩阵形式的地方。
答案 1 :(得分:3)
如果你想直接创建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矩阵读为双值。