Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 从视差图中获取真实深度_Opencv_Computer Vision_Stereo 3d - Fatal编程技术网

Opencv 从视差图中获取真实深度

Opencv 从视差图中获取真实深度,opencv,computer-vision,stereo-3d,Opencv,Computer Vision,Stereo 3d,我想得到物体和立体相机的真实距离。我使用的是学习OpenCV O'Reilly一书中给出的OpenCV示例代码。获得视差图后,我想使用以下公式: 距离=焦距*基线距离/视差 问题是: 我得到了差异的负值。如何转换这些值以便在实际深度计算中使用 在上面的公式中,焦距和基线距离以毫米为单位(由重投影矩阵返回),而视差以像素为单位。因此,结果将以毫米^2/像素为单位。如何将视差值从像素转换为毫米 可以使用CVs立体对应函数,例如立体块匹配或半全局块匹配。这将为整个图像提供一个视差图,可以使用Q矩阵(c

我想得到物体和立体相机的真实距离。我使用的是学习OpenCV O'Reilly一书中给出的OpenCV示例代码。获得视差图后,我想使用以下公式:

距离=焦距*基线距离/视差

问题是:

  • 我得到了差异的负值。如何转换这些值以便在实际深度计算中使用

  • 在上面的公式中,焦距和基线距离以毫米为单位(由重投影矩阵返回),而视差以像素为单位。因此,结果将以毫米^2/像素为单位。如何将视差值从像素转换为毫米


  • 可以使用CVs立体对应函数,例如立体块匹配或半全局块匹配。这将为整个图像提供一个视差图,可以使用Q矩阵(cv::ReprojectionMageto3D)将其转换为3D点。

    这里有两个问题:

  • 单位。假设您的相机已校准,则焦距以像素为单位,因此视差单位为mm或任何其他公制单位。看到我对同一个问题的回答了吗 .

  • 如果3D点位于彼此平行的两个摄影机前面,则视差不能为负。如果轴会聚或相机未校准,则可能发生这种情况。请参阅此以了解详细信息


  • 您需要首先执行步骤,以获得正确的参数,即摄影机矩阵

    一旦有了这些值,就可以使用校正值(从相机校准步骤获得的值,称为重新映射或不失真)对进行适当的计算,然后,为了获得真实深度(以毫米或米为单位),最后可以执行以下操作:

    depth = baseline * focal / disparity
    

    为什么我会得到差异的负值?据我所知,这应该是积极的。这和摄像机的方位有关吗?