opencv中reprojectImageTo3D函数的Q矩阵

Posted

技术标签:

【中文标题】opencv中reprojectImageTo3D函数的Q矩阵【英文标题】:Q matrix for the reprojectImageTo3D function in opencv 【发布时间】:2015-02-07 02:39:15 【问题描述】:

我正在 opencv 中做一个项目,以使用立体校准检测盲人路径中的障碍物。我已经正确计算了视差图。现在要找到障碍物与相机的距离,我想要它的 3D 坐标 [X,Y,Z] ,我猜它可以通过 reprojectImageTo3D() 找到,但我没有在这个函数中使用的 Q 矩阵,因为我从 stereoRectify() 获得的 Q 矩阵即将变为空,可能是因为我使用了预校准的图像。虽然我确实有我的相机的内在和外在参数。 所以我的问题是,如果我知道焦距、基线和关于我的相机的所有其他信息,我如何手动创建 Q 矩阵以直接在函数 reprojectImageTo3D() 中使用? Q矩阵的基本格式是什么?

【问题讨论】:

立体视觉3D重建的简要说明如下图所示。可以得到Q矩阵,从过程中对它有更好的理解。 ![enter image description here](i.stack.imgur.com/LrDRD.jpg) 【参考方案1】:

Q矩阵的形式如下:

在该图像中,cxcy 是左侧主点的坐标相机(如果您使用左侧相机主导进行立体匹配),c'x 是右侧相机中主点的 x 坐标(cCV_CALIB_ZERO_DISPARITY 指定CV_CALIB_ZERO_DISPARITY 标志,则 sub>xc'x 将相同), f 是焦距,Tx 是基线长度(可能是基线长度的负数,它是从一个光学中心到另一个 I想想)。

我建议您阅读本书Learning OpenCV 了解更多信息。它仍然基于旧的 C 接口,但很好地解释了基础理论,并且是我从中获取 Q 矩阵形式的地方。

【讨论】:

干得好。如果你能提到计算Q矩阵的方法 嗨,我知道 cx 和 cy 以像素为单位。 f和Tx的单位是什么? @Employee : f 以像素为单位。 Tx 以米(或毫米)为单位【参考方案2】:

如果要直接创建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 矩阵读取为双精度值。

【讨论】:

这些数字从何而来? 这个 QMatrix 是“校准”过程的输出 T_x坐标不应该是Q.at&lt;double&gt;(3,2) = -1.0/95 如何获得Q.at&lt;double&gt;(2,3)=348.087; //Focal 值?

以上是关于opencv中reprojectImageTo3D函数的Q矩阵的主要内容,如果未能解决你的问题,请参考以下文章

opencv 中自带的模板匹配算法出处

opencv中cvScalarAll函数啥意思???

c++中如何调用opencv库

Opencv+Python:在Opencv中绘制函数

android如何在 java opencv 中查找最大轮廓

在 .pch 文件中找不到 opencv2/opencv.hpp 文件