OpenCV中reprojectImageTo3D函数的Q矩阵。

13

我在做一个基于OpenCV的项目,使用立体标定来检测盲人路径中的障碍物。我已经成功计算出视差图。现在,为了找到摄像头到障碍物的距离,我想得到其三维坐标 [X,Y,Z],我猜这可以通过reprojectImageTo3D()函数实现,但是我没有Q矩阵可用于此函数,因为我从stereoRectify()函数中得到的Q矩阵为空,可能是因为我使用的是预校准图像。尽管我有相机的内参和外参参数。

所以我的问题是,如果我知道相机的焦距,基线和其他一切信息,如何手动创建Q矩阵以直接用于reprojectImageTo3D()函数? Q矩阵的基本格式是什么?


2
下面的图片简要描述了立体视觉的三维重建。您可以从该过程中获取Q矩阵并更好地理解它。enter image description here - Gavin Gao
@GavinGao 从整流坐标系转换为非整流坐标系怎么样? - Pedro77
@Pedro77 这是一个相反的过程。 - Gavin Gao
2个回答

28
Q矩阵的形式如下所示: Q Matrix Image 在该图像中,cxcy是左侧相机主点的坐标(如果您使用左侧相机进行立体匹配),c'x是右侧相机主点的x坐标(如果您为stereoRectify()指定了CV_CALIB_ZERO_DISPARITY标志,则cxc'x将相同),f是焦距,Tx是基线长度(可能是基线长度的负值,它是从一个光学中心到另一个光学中心的平移)。
我建议查看书籍Learning OpenCV以获取更多信息。它仍然基于旧的C接口,但很好地解释了底层理论,并且是我从中获取Q矩阵形式的来源。

1
好的工作。如果您能提及计算Q矩阵的方法,那就更好了。 - VenushkaT
1
嗨,我知道cx和cy是以像素为单位测量的。f和Tx的单位度量是什么? - Employee
2
@员工:f以像素为单位。Tx以米(或毫米)为单位。 - ianinini
1
Tx后面有多余的括号。 - simplename

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矩阵读取为双精度值。


1
这些数字从哪里来的? - Atnas
这个QMatrix是一个名为“校准”过程的输出。 - DrunkenMaster
T_x坐标不应该是Q.at<double>(3,2) = -1.0/95吗? - Lxrd-AJ
你如何获得 Q.at<double>(2,3)=348.087; //焦距 的值? - decadenza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接