c++学习【9】双目模型重建

文章讲述了通过OpenCV中的StereoSGBM算法计算左右图像的视差,涉及参数如P1、P2、minDisparity等,并详细解释了视差图的数据转换过程,将16位整数视差值转换为浮点数表示实际距离。
摘要由CSDN通过智能技术生成

视差(disparity)是通过计算立体匹配算法(StereoSGBM)得到的。立体匹配是一种用于计算左右立体图像之间像素对应关系的方法。

首先,通过cv::StereoSGBM::create()函数创建了一个立体匹配对象sgbm,并传入一系列参数:

  • P1: 控制视差平滑度的第一个参数,越大表示视差变化越平滑。
  • P2: 控制视差平滑度的第二个参数,越大表示视差变化越平滑。
  • preFilterCap: 预处理滤波器的最大值。它是一个限制滤波器输出值的阈值,用于消除杂散噪声。
  • minDisparity: 最小视差值。
  • numDisparities: 可能的视差值的范围,每个像素将在这个范围内搜索最佳匹配。
  • uniquenessRatio: 具有最佳匹配之外的第二最佳匹配的阈值。
  • speckleWindowSize: 视差图上移除孤立的小斑点的窗口大小。
  • speckleRange: 视差图上移除孤立的小斑点的阈值。
  • disp12MaxDiff: 左右两个像素之间的最大视差差异。

接下来,通过sgbm->compute()函数计算了左右两张图像的视差图(disparity_sgbm)。

最后,通过disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f)函数将视差图的数据类型转换为CV_32F,并将每个像素的值除以16,得到实际的视差值。这是因为在计算视差时,通常会将像素值乘以一个放大因子,以避免损失精度。而在这里,将其恢复为实际视差值,除以16表示将该放大因子还原。

注意:视差图的单位是像素,较小的视差值表示较远的距离,较大的视差值表示较近的距离。

disparity_sgbm是通过sgbm->compute()函数计算得到的视差图,其数据类型为CV_16S,表示每个像素的视差值是一个有符号的16位整数。该视差图的数值范围通常是根据算法的参数和输入图像的大小来确定,一般是一个较小的范围,比如[-128, 127]或[-64, 63]。这种有符号的16位整数视差图可以存储较大的视差范围,但其数值不直接对应实际的距离。

为了得到实际的视差值,通常会将disparity_sgbm转换成disparity。通过disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f)将视差图的数据类型转换为CV_32F,即单精度浮点数。转换后,每个像素的值表示实际的视差值,单位为像素。并且,除以16是根据具体的算法参数来确定的,用于将之前的视差值还原为实际的视差值。

总结起来,disparity_sgbm是一个有符号的16位整数视差图,disparity是一个单精度浮点数视差图,存储了实际的视差值,单位为像素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值