👨🎓个人主页
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
基于双目立体匹配的景深计算研究
1. 双目立体匹配的基本原理
2. 景深计算的定义与理论
3. 立体匹配算法的分类与对比
3.1 传统方法
3.2 基于深度学习的方法
4. 视差图优化与深度图生成
5. 应用案例
6. 最新研究进展
7. 挑战与未来方向
📚2 运行结果
🎉3 参考文献
🌈4 Matlab代码实现
💥1 概述
基于双目立体匹配的景深计算研究
双目立体匹配一直是双眼视觉的研究热点。双目相机捕获同一场景的左右视点图像,使用立体匹配匹配算法获得视差图和深度图。
流程:
首先导入左右图像,并设置合理的搜索窗口和模板大小。以每个像素为中心,并使用固定大小的像素作为模板。假设相机已被校正,因此它仅水平搜索。在搜索窗口中连续移动左侧图像模板,以计算左侧和右侧模板的成本。获得成本后,通过累积像素信息来提高结果的信噪比,即成本聚合过程。这里我们优化窗口中最小生成值的坐标,并使用抛物线拟合来更新视差值。最后,对得到的视差图进行细化(使用中值滤波器),以消除视差图中产生的部分噪声。
1. 双目立体匹配的基本原理
双目立体视觉通过模拟人眼视差感知机制,利用两个相机从不同视角采集同一场景的图像,通过立体匹配技术计算视差图,进而推导出深度信息。其核心流程包括以下步骤:
-
双目标定
确定相机的内参(焦距、主点坐标、畸变系数)和外参(两相机间的旋转矩阵RR和平移向量TT),建立两相机的几何关系模型。 -
极线校正
将两幅图像的极线对齐至水平方向,简化匹配搜索范围为一维水平线,降低计算复杂度。 -
立体匹配
- 代价计算:通过像素或特征相似性(如SAD、SSD、Census变换、NCC等)构建初始代价体。
- 代价聚合:利用窗口或全局优化方法(如动态规划、图割)平滑代价体,提升匹配鲁棒性。
- 视差计算:通过赢家通吃(WTA)策略选择最小代价对应的视差值,生成初始视差图。
- 视差优化:采用左右一致性检测、中值滤波、空洞填充等方法优化视差图,减少误匹配。
- 代价计算:通过像素或特征相似性(如SAD、SSD、Census变换、NCC等)构建初始代价体。
-
深度计算
根据三角测量原理,视差dd与深度ZZ成反比,公式为:
其中f为焦距,B为基线距离。
2. 景深计算的定义与理论
景深(Depth of Field, DOF)指场景中能清晰成像的纵向范围,其计算不仅依赖双目立体匹配结果,还需考虑光学参数:
- 影响因素:光圈大小(有效F值)、焦距、拍摄距离、传感器尺寸。
- 公式推导:
3. 立体匹配算法的分类与对比
3.1 传统方法
算法类型 | 核心思想 | 优点 | 缺点 |
---|---|---|---|
局部匹配 | 基于窗口相似性(SAD、NCC等) | 计算速度快 | 低纹理区域误匹配率高 |
全局匹配 | 最小化全局能量函数(动态规划、图割) | 精度高 | 计算复杂度高 |
半全局匹配(SGBM) | 结合局部和全局优化策略 | 速度与精度平衡 | 参数调优复杂 |
3.2 基于深度学习的方法
- CNN方法:通过卷积神经网络提取多尺度特征,构建代价体并聚合,如GCNet、PSMNet。
- Transformer方法:利用自注意力机制捕捉长距离依赖,解决CNN感受野受限问题。
- 混合方法:结合传统算法与深度学习(如AD-Census改进算法),在低纹理区域提升18%精度。
4. 视差图优化与深度图生成
-
视差优化技术
- 错误检测:左右一致性检测(式11)剔除遮挡点。
- 空洞填充:邻域插值或最小视差填充。
- 滤波处理:加权中值滤波平滑噪声。
-
深度图生成
通过视差图转换公式计算深度,并融合超像素分割、多尺度特征融合等技术提升精度。
5. 应用案例
- 机器人导航
基于景深信息的避障策略(如深度强化学习中的奖励预测与碰撞约束),提升路径规划效率。 - AR/VR
实时景深模拟(如GPU加速滤波算法)增强虚拟场景的沉浸感。 - 工业测量
双目结构光混合方法实现高精度体积测量,误差小于5%。
6. 最新研究进展
- 深度学习模型创新
- 注意力机制:如MS-ACV网络通过多尺度注意力提升视差估计精度。
- 端到端优化:DRR网络通过检测-替换-精修三步迭代优化视差图。
- 硬件加速
GPU并行化处理使传统算法速度提升1\sim2个数量级。 - 多模态融合
结合结构光与双目视觉,解决低纹理场景的匹配难题。
7. 挑战与未来方向
- 挑战
- 低纹理、反光表面的匹配精度不足。
- 实时性与计算资源的平衡。
- 未来方向
- 轻量化深度学习模型(如MobileStereoNet)。
- 多传感器融合(LiDAR、ToF)提升鲁棒性。
- 自监督学习减少对标注数据的依赖。
📚2 运行结果
主函数部分代码:
clc; clear;%% 加载2张立体图像 left = imread('iml1545.jpg'); right = imread('imr1545.jpg'); sizeI = size(left);% 显示复合图像 zero = zeros(sizeI(1), sizeI(2)); channelRed = left(:,:,1); channelBlue = right(:,:,3); composite = cat(3, channelRed, zero, channelBlue);figure(1); subplot(2,3,1); imshow(left); axis image; title('左图');subplot(2,3,2); imshow(right); axis image; title('右图');subplot(2,3,3); imshow(composite); axis image; title('重叠图');%% 基本的块匹配% 通过估计子像素的块匹配计算视差 disp('运行基本的块匹配~');% 启动定时器 tic();% 平均3个颜色通道值将RGB图像转换为灰度图像 leftI = mean(left, 3); rightI = mean(right, 3);% SHD % bitsUint8 = 8; % leftI = im2uint8(leftI./255.0); % rightI = im2uint8(rightI./255.0);% DbasicSubpixel将保存块匹配的结果,元素值为单精度32位浮点数 DbasicSubpixel = zeros(size(leftI), 'single');% 获得图像大小 [imgHeight, imgWidth] = size(leftI);% 视差范围定义离第1幅图像中的块位置多少像素远来搜索其它图像中的匹配块。 disparityRange = 50;% 定义块匹配的块大小 halfBlockSize = 5; blockSize = 2 * halfBlockSize + 1;% 对于图像中的每行(m)像素 for (m = 1 : imgHeight)% 为模板和块设置最小/最大块边界% 比如:第1行,minr = 1 且 maxr = 4minr = max(1, m - halfBlockSize);maxr = min(imgHeight, m + halfBlockSize);% 对于图像中的每列(n)像素for (n = 1 : imgWidth)% 为模板设置最小/最大边界% 比如:第1列,minc = 1 且 maxc = 4minc = max(1, n - halfBlockSize);maxc = min(imgWidth, n + halfBlockSize);% 将模板位置定义为搜索边界,限制搜索使其不会超出图像边界 % 'mind'为能够搜索至左边的最大像素数;'maxd'为能够搜索至右边的最大像素数% 这里仅需要向右搜索,所以mind为0% 对于要求双向搜索的图像,设置mind为max(-disparityRange, 1 - minc)mind = 0; maxd = min(disparityRange, imgWidth - maxc);% 选择右边的图像块用作模板template = rightI(minr:maxr, minc:maxc);% 获得本次搜索的图像块数numBlocks = maxd - mind + 1;% 创建向量来保存块偏差blockDiffs = zeros(numBlocks, 1);% 计算模板和每块的偏差for (i = mind : maxd)%选择左边图像距离为'i'处的块block = leftI(minr:maxr, (minc + i):(maxc + i));% 计算块的基于1的索引放进'blockDiffs'向量blockIndex = i - mind + 1;%{% NCC(Normalized Cross Correlation)ncc = 0;nccNumerator = 0;nccDenominator = 0;nccDenominatorRightWindow = 0;nccDenominatorLeftWindow = 0;%}% 计算模板和块间差的绝对值的和(SAD)作为结果for (j = minr : maxr)for (k = minc : maxc)% SAD(Sum of Absolute Differences)blockDiff = abs(rightI(j, k) - leftI(j, k + i));blockDiffs(blockIndex, 1) = blockDiffs(blockIndex, 1) + blockDiff;%{% NCCnccNumerator = nccNumerator + (rightI(j, k) * leftI(j, k + i));nccDenominatorLeftWindow = nccDenominatorLeftWindow + (leftI(j, k + i) * leftI(j, k + i));nccDenominatorRightWindow = nccDenominatorRightWindow + (rightI(j, k) * rightI(j, k));%}endend
🎉3 参考文献
[1]杨晓立,叶乐佳,赵鑫,王飞,徐玉华,肖振中.双目立体视觉研究进展与应用[J/OL].激光与光电子学进展:1-30[2023-06-06].
部分理论引用网络文献,若有侵权联系博主删除。