立体视觉中视差缩放1/16的原因——基于OpenCV StereoSGBM代码
关于OpenCV StereoSGBM视差结果缩放1/16的疑问
问题背景
以下是用于计算立体相机视差的代码片段,疑问点在于disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f);这一行,为何要将视差按1/16的比例缩放:
int main(int argc, char **argv) { // 内参 double fx = 718.856, fy = 718.856, cx = 607.1928, cy = 185.2157; // 基线 double b = 0.573; // 读取图像 cv::Mat left = cv::imread(left_file, 0); cv::Mat right = cv::imread(right_file, 0); cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create( 0, 96, 9, 8 * 9 * 9, 32 * 9 * 9, 1, 63, 10, 100, 32); // 神奇的参数 cv::Mat disparity_sgbm, disparity; sgbm->compute(left, right, disparity_sgbm); disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f);
原因解释
这是OpenCV StereoSGBM模块的设计规则:
StereoSGBM::compute输出的视差图disparity_sgbm是16位有符号整数类型(CV_16S),它把真实视差值放大了16倍后存储。- 这么做的目的是用整数格式保留亚像素级的视差精度:比如真实视差是2.375,直接存浮点数占内存,放大16倍后得到38(2.375×16),用整数存储既节省空间,又能保证0.0625(1/16)的精度。
- 调用
convertTo时除以16,就是把这个放大的整数值还原成真实的浮点数视差,这样后续用深度公式z = fx*b / disparity计算场景深度时,才能得到正确的结果。
内容的提问来源于stack exchange,提问作者CVDE
相关产品推荐
相关产品推荐

