【发布时间】:2023-03-21 08:15:01
【问题描述】:
我从之前的帖子中看到,当您使用disptype==CV_16S 在打开的 cv 中获取视差图中的视差值时,您将除以16.0。当视差图是类型CV_8U时怎么样?
是否必须除以8.0 才能获得真正的视差值?我还没有找到任何关于这种特定类型的文档。
【问题讨论】:
我从之前的帖子中看到,当您使用disptype==CV_16S 在打开的 cv 中获取视差图中的视差值时,您将除以16.0。当视差图是类型CV_8U时怎么样?
是否必须除以8.0 才能获得真正的视差值?我还没有找到任何关于这种特定类型的文档。
【问题讨论】:
CV_8U的视差图可以通过imgDisparity16S.convertTo( imgDisparity8U, CV_8UC1, range);
从CV_16S类型的视差图中得到
其中范围计算为range = 255 / maxVal - minVal 和minMaxLoc( imgDisparity16S, &minVal, &maxVal );
所以我猜范围的倒数,即1 / range 会将 CV_8U 转换为 CV_16S,然后你就可以获得实际的视差值。
P.S : 这个我没试过。
【讨论】:
除以 16 是因为 StereoSGBM 的原始视差输出 按 16 缩放,而不是因为视差的位深度/disptype。
如果您使用sgbm->compute(left, right, disp);,则输出显示类型为CV_16S,即使您之前将disp 初始化为CV_8U 类型。因此,使用convertTo 并除以16.f 是正确的方法。 (如果您出于某种原因想要在使用convertTo 和reprojectImageTo3D 之前修改disp,那么我不知道您将如何获得真正的差异值。但是,可以convertTo CV_8U而不是CV_32F,但结果显然不会完全相似。)
【讨论】: