立体视觉几何 (二)

1.视差

在这里插入图片描述

2.立体匹配

  1. 立体匹配的基本概念:

    • 匹配目标: 在立体匹配中,主要目标是确定左图像中像素的右图像中的对应像素。这个对应像素通常位于相同的行。
    • 视差(Disparity): 视差 d 是右图像中对应像素 xr 和左图像中像素 xl 之间的水平位置差。视差是深度信息的关键指标。
  2. 匹配方法:

    • 方法涉及在左图像中以某个像素为中心取一个窗口 W,然后将这个窗口沿水平方向平移视差 d,并将其放置在右图像中。
    • 接着比较左图像中窗口 W 和右图像中平移后窗口 W 内的像素强度值。
  3. 比较度量:

    • 比较度量公式通常有如下形式:
      在这里插入图片描述

    • 这里 S(d) 是某个特定视差 d 的匹配得分。

    • I_l(x, y)I_r(x+d, y) 分别是左图像和右图像中相应位置的像素强度值。

    • 求和是对窗口 W 中所有像素进行的,意味着比较的是整个窗口的像素强度差的总和或平均值。

  4. 分析:

    • 这种方法基于的假设是,左图像中的窗口和右图像中相对应的窗口在视觉内容上应该是相似的。
    • 通过调整视差 d 并计算每个可能的 d 值的匹配得分 S(d),可以确定最佳匹配视差,即得分最低(或最高,取决于具体实现)的那个 d
    • 这种方法有效但计算量较大,尤其是在处理大尺寸图像和大窗口时。

总的来说,这个立体匹配方法是通过比较左图像中的一个窗口和右图像中相应平移的窗口来寻找最佳匹配视差的一种经典方法。它在众多应用中被广泛使用,如3D重建、机器人导航等。

匹配函数

在立体视觉中,为了找到两个图像间的对应像素,通常会使用不同的匹配函数来计算像素间的相似度。您提到的两种匹配函数,SSD(平方差之和)和SAD(绝对差之和),都是用来衡量两幅图像中对应窗口内像素差异的常见方法。让我们详细分析这两种函数:

1. SSD(Sum of Squared Differences)

  • 定义:
    在这里插入图片描述

    其中 (I_l) 和 (I_r) 分别是左图像和右图像中的像素强度,(d) 是视差,(W) 是选定的窗口。

  • 特点:

    • SSD通过对像素差的平方求和,对大的像素差异给予更大的权重。
    • 在图像较为清晰、噪声较低的情况下,SSD能够有效地突出实际的像素差异。
  • 缺点:

    • 当图像含有噪声时,SSD会由于平方项的作用,过分放大噪声的影响,导致匹配误差增大。

2. SAD(Sum of Absolute Differences)

  • 定义:
    在这里插入图片描述

    同样地,这里 (I_l) 和 (I_r) 是左右图像中的像素强度,(d) 是视差,(W) 是窗口。

  • 特点:

    • SAD计算的是像素差的绝对值之和,对所有像素差异给予平等的权重。
    • 相比SSD,SAD对噪声的敏感性较低,因此在噪声较多的图像中表现更好。
  • 缺点:

    • SAD可能不如SSD敏感于大的像素差异,有时可能忽略重要的特征差异。

总结

  • SSD和SAD都是衡量图像间相似度的有效方法,但它们各有优势和局限性。
  • SSD更适用于低噪声图像,能够强调大的像素差异,但在噪声较多的情况下可能不理想。
  • SAD在处理噪声图像时表现更好,但可能对某些重要的像素变化不够敏感。
  • 选择哪种匹配函数取决于具体的应用场景和图像特性,以及处理速度的要求。在某些硬件架构上,SAD的计算可能比SSD更快。

您提到了相关性(Correlation)和归一化相关性(Normalized Correlation)这两种用于立体匹配的方法。让我们分析这两种方法的定义、特点和应用场景。

3. 相关性(Correlation)

  • 定义:
    在这里插入图片描述

    这里的 (I_l) 和 (I_r) 分别表示左右图像中的像素强度,(d) 是视差,(W) 是考虑的窗口。

  • 特点:

    • 相关性衡量的是两个图像窗口中对应像素强度的乘积之和。
    • 当两个图像窗口完全相同时,相关性达到最大值。
    • 相关性在某种程度上与SSD相似,但更直接地考虑了像素强度的乘积。
  • 应用:

    • 相关性适用于像素强度直接相关的情况,但通常需要与归一化方法结合使用,以提高其鲁棒性。

4. 归一化相关性(Normalized Correlation)

  • 定义:
    在这里插入图片描述

    其中 (\bar{I}_l) 和 (\bar{I}_r) 分别是左右图像窗口的平均像素强度,(\sigma_l) 和 (\sigma_r) 是左右图像窗口的标准差。

  • 特点:

    • 归一化相关性考虑了图像窗口的像素强度分布,消除了绝对强度的影响。
    • 它的值总是在 -1 到 +1 之间,+1 表示完美匹配。
    • 相比未归一化的相关性,归一化相关性在不同光照和对比度条件下更加稳定。
  • 应用:

    • 归一化相关性计算更加复杂和耗时,但它适用于需要高鲁棒性和精确度的场景。
    • 特别适用于图像对比度和亮度变化较大的情况。

总结

  • 相关性和归一化相关性都是衡量两个图像窗口相似度的有效方法。
  • 相关性简单但受光照和对比度影响较大,而归一化相关性虽然计算更复杂,但在处理不同光照和对比度条件下的图像时更加稳定和准确。
  • 根据具体的应用需求和图像条件,可以选择最适合的方法。
    在这里插入图片描述
  1. 视差的定义:

    • 视差是指在双目立体视觉系统中,同一个三维点在左右两个摄像机成像平面上投影点之间的水平距离差。
    • 在一对校正后的双目图像中,视差通常表现为同一物体或场景点在两幅图像中的水平位置差。
  2. 视差与深度的关系:

    • 在立体视觉中,视差与场景中物体到摄像机的距离(即深度)成反比关系。这意味着物体离摄像机越近,其在两个摄像机成像平面上的投影点的视差就越大。
    • 反之,如果物体离摄像机很远,其投影点的视差就会很小,甚至接近于零。在极端情况下,无限远处的物体(例如远处的星星)在两个摄像机中的视差几乎为零。
  3. 视差的应用:

    • 在计算机视觉和机器人领域,视差图(一幅图像,其中每个像素的值代表该像素的视差)被用来估计场景的三维结构。
    • 通过计算和分析视差图,可以确定物体的大致位置和形状,这对于三维重建、机器人导航、避障系统等应用至关重要。
  4. 视差的计算:

    • 视差的计算通常涉及在一对双目图像中为每个像素点寻找最佳的匹配点,并计算这两点之间的水平位置差。
    • 这个过程可以通过各种算法实现,如区块匹配、半全局匹配(SGM)等。

总结

“视差是深度的倒数”这一概念是立体视觉领域的基础,它表明物体到摄像机的距离越近,其在双目图像中的视差就越大。这个原理在多个领域有着广泛的应用,特别是在需要精确深度信息的场景中。通过分析视差,可以获取有关场景和物体的三维信息,这对于许多计算机视觉应用至关重要。

匹配算法实现

在这里插入图片描述
这个算法的目标是在一对双目图像中为每个像素找到最佳匹配视差。让我们逐步分析这个算法的实现和关键点:

算法概述

  1. 外部循环 - 遍历每个像素:

    • 算法首先通过两个嵌套循环遍历图像中的每个像素(坐标为 (x, y))。
    • xsizeysize 分别是图像的宽度和高度。
  2. 视差范围:

    • 第三个循环遍历所有可能的视差值 d,从 dmindmax。这个范围定义了算法搜索匹配的深度。
  3. 初始化最佳匹配分数:

    • 对于每个像素,初始化一个最佳匹配分数 Sbest 为最大值(可能表示无穷大或一个足够大的数)。
  4. 局部窗口 - 计算匹配分数:

    • 对于每个视差值 d,在像素 (x, y) 周围的一个小窗口内(大小由 w 定义)计算匹配分数 S(d)
    • S(d) 是窗口内所有像素的某种匹配度量(例如 SSD 或 SAD)的累积。
  5. 更新最佳匹配和视差:

    • 如果当前的匹配分数 S(d) 小于当前的最佳分数 Sbest,则更新 SbestS(d),并记录下这个视差值 d 作为当前像素的最佳视差 dbest(x, y)

算法的优化

  • 循环顺序可调换:

    • 算法中的循环(x, y, d)可以按不同的顺序执行。不同的顺序可能影响算法的效率。
  • 计算优化:

    • 尽管这个算法看起来计算量巨大,但通过重用部分结果可以有效地提高效率。例如,当计算邻近像素的匹配分数时,可以重用上一个像素计算的部分结果。
    • 还可以使用积分图(Integral Image)等技术来优化窗口内的匹配度量计算。

总结

这个算法是一个典型的窗口基础的双目匹配算法。它适用于计算每个像素点的最佳匹配视差,进而可以用来构建整个视差图。虽然基本的实现看起来计算量巨大,但通过各种优化技术,可以在实际应用中高效地执行。这种类型的算法是计算机视觉和机器人领域中三维重建和深度感知的基础。

import numpy as npdef stereo_matching(left_img, right_img, dmin, dmax, window_size):xsize, ysize = left_img.shapew = window_size // 2dbest = np.zeros_like(left_img, dtype=np.float32)for x in range(w, xsize - w):for y in range(w, ysize - w):Sbest = float('inf')for d in range(dmin, dmax + 1):if x + d + w >= xsize:  # 确保窗口不会超出图像范围continue# 计算匹配分数,这里以SAD为例Sd = 0for u in range(-w, w + 1):for v in range(-w, w + 1):diff = int(left_img[x + u, y + v]) - int(right_img[x + u + d, y + v])Sd += abs(diff)# 更新最佳匹配和视差if Sd < Sbest:Sbest = Sddbest[x, y] = dreturn dbest# 示例使用
# left_img 和 right_img 需要是加载的左右图像
# dmin 和 dmax 分别是视差搜索的最小值和最大值
# window_size 是匹配窗口的大小,通常是一个奇数,例如5或9
# disparity_map = stereo_matching(left_img, right_img, dmin, dmax, window_size)

函数功能

  • 函数定义:
    stereo_matching(left_img, right_img, dmin, dmax, window_size) 是一个双目匹配函数,它接收左右两个图像、最小和最大视差值以及匹配窗口的大小作为输入。

主要步骤

  1. 初始化:

    • 获取输入图像的尺寸 xsize, ysize
    • 定义一个与左图像同样大小的数组 dbest 来存储每个像素的最佳视差值。
  2. 像素遍历:

    • 通过两层嵌套循环遍历图像中的每个像素。循环从 w(窗口半径)开始,以避免窗口超出图像边界。
  3. 视差计算:

    • 对于每个像素,内部循环遍历所有可能的视差值 d
    • 判断条件 if x + d + w >= xsize 用于确保窗口在进行视差计算时不会超出图像的右侧边界。
  4. 匹配分数(SAD)计算:

    • 使用SAD(绝对差之和)方法来计算匹配分数 Sd。这是通过比较左图像窗口和右图像相应窗口(考虑视差 d)中的像素强度来完成的。
  5. 更新最佳匹配视差:

    • 如果当前视差的匹配分数 Sd 小于之前的最佳分数 Sbest,则更新 Sbest 并记录当前的视差 d 作为该像素的最佳视差 dbest[x, y]

使用示例

  • 要使用这个函数,你需要提供左右图像(left_imgright_img),视差搜索范围(dmindmax)以及匹配窗口的大小(window_size)。窗口大小通常是一个奇数,例如5或9。
  • 在这里插入图片描述

3.恢复场景点的3D坐标

在这里插入图片描述
假设两个相机具有平行的像平面

f - 相机的焦距

B - 光心之间的距离

一些重要的结论

“这个关系是立体视觉的基本关系。” - 这个陈述表明在立体视觉中有一个基本关系,对于理解和处理立体图像非常重要。

“深度与视差成反比。” - 这个陈述指出,在立体视觉中,深度(物体到相机的距离)与视差(左右两个相机观察到的物体位置的差异)成反比关系。换句话说,随着视差减小,深度增加。

“一旦我们知道Z,其他两个坐标可以使用标准透视方程推导出来。” - 这表明在立体视觉系统中,如果您知道物体的深度(Z),您可以使用标准透视方程计算出其其他两个坐标(X和Y)。这是计算机视觉和三维重建中的常见概念。
在这里插入图片描述

“相机校准:内参和外参参数。” - 这提到了相机校准的重要性,包括确定相机的内参参数(例如焦距、光学中心)和外参参数(例如相机位置和方向)。校准对于在立体视觉中准确估计深度和进行三维重建非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对MODNet 主干网络 MobileNetV2的剪枝探索

目录 1 引言 1.1 MODNet 原理 1.2 MODNet 模型分析 2 MobileNetV2 剪枝 2.1 剪枝过程 2.2 剪枝结果 2.2.1 网络结构 2.2.2 推理时延 2.3 实验结论 3 模型嵌入 3.1 模型保存与加载 法一&#xff1a;保存整个模型 法二&#xff1a;仅保存模型的参数 小试牛刀 小结…

MSPM0L1306例程学习-UART部分(2)

MSPM0L1306例程学习系列 1.背景介绍 写在前边的话&#xff1a; 这个系列比较简单&#xff0c;主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包&#xff0c;具体可到官网下载并安装: https://www.ti…

YOLOv8改进 | 主干篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv8的主干上针对于图像的输入进行增…

【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、OpenSSL介绍二、OpenSSL配置三、Window环境下配置四、Linux环境下配置五、Mac环境下配置 一、OpenSSL介绍 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这…

vectorCast手动添加测试用例配置输入参数和期望值

1.选中函数&#xff0c;点击右键选择插入测试用例。这里所选择的插入测试用例区别于之前的测试用例的地方在于&#xff0c;这里插入测试用例是手动配置的&#xff0c;之前的是自动生成的。手动配置可以自定义选择输入参数和期望值。 2.添加测试用例后&#xff0c;点击测试用例&…

Mybatis 动态SQL删除操作

实现动态删除多个数据,这里我们需要用到 foreach 标签,这个标签还可以运用到批量插入,反正需要对集合进行遍历时就可以使用该标签,标签有如下属性 : 新建了一个 userInfo2Mapper 接口,然后写下如下代码,声明 batchDelete 方法 package com.example.mybatisdemo.mapper; import…

城市道路智慧养护顶层设计建议书

项目通过对国家在推动智慧交通领域的健康发展上发布的如&#xff1a;《交通强国建设纲要》、《推进综合交通运输大数据发展行动纲要(2020-2025年)》、《数字交通发展规划纲要》等相关政策的深入理解与研究&#xff0c;结合“互联网”、“智能化”、“智慧化”等理念,对国家提出…

【算法】利用模拟算法、规律解算法题(C++)

文章目录 1. 前言2. 算法题1576.替换所有的问号495.提莫攻击6.Z字形变换38.外观数列1419.数青蛙 1. 前言 模拟算法 即模拟问题过程来解决问题的算法。 对于一些算法题&#xff0c;我们只需要将题目的过程 用代码编写出来&#xff0c;再结合其他方法&#xff0c;就可以解决。 …

Geogebra绘制分段函数、导数

分段函数绘制 一、下载Geogebra6&#xff0c;输入下面的代码: f(x)x g(x)sin(x) h(x)x^3 p(x)如果(x<0, f(x), x<2, h(x), g(x)) 二、我们会得到下面的图 三、把左边的三个圆圈点击取消掉&#xff0c;右侧就变成了分段函数 导数绘制 f(x)x^3-4x^2x-6 f 效果如下&…

JavaSE复习流程

一.初识JAVA 1.JAVA语言之父--高斯林。 2.javac--字节码文件 3.注释&#xff1a;单行注释&#xff0c;多行注释&#xff0c;文档注释。 二.数据类型与变量 1.数据类型 类型 byte shortintlongfloatdoublecharboolean大小1字节2字节4字节8字节4字节8字节1字节包装类型Byt…

SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

TCP/IP网络通信协议最早是由罗伯特卡恩&#xff08;Robert E. Kahn&#xff09;和文顿瑟夫&#xff08;Vinton G. Cerf&#xff09;于1972年提出的&#xff0c;它是一个实际的协议栈。 OSI七层网络通信协议最早是由国际标准化组织&#xff08;ISO&#xff09;于1977年提出的&am…

使用AFPN渐近特征金字塔网络优化YOLOv8改进小目标检测效果(不适合新手)

目录 简单概述 算法概述 优化效果 参考文献 文献地址&#xff1a;paper 废话少说&#xff0c;上demo源码链接&#xff1a; 简单概述 AFPN的核心思想&#xff1a;AFPN主要通过引入渐近的特征融合策略&#xff0c;逐步整合底层、高层和顶层的特征到目标检测过程中。这种融合…

文件上传笔记整理

文件上传 web渗透的核心&#xff0c;内网渗透的基础 通过上传webshell文件到对方的服务器来获得对方服务器的控制权 成功条件 文件成功上传到对方的服务器&#xff08;躲过杀软&#xff09; 知道文件上传的具体路径 上传的文件可以执行成功 文件上传的流程 前端JS对上传文件进行…

Sqoop与Kafka的集成:实时数据导入

将Sqoop与Kafka集成是实现实时数据导入和流处理的关键步骤之一。Sqoop用于将数据从关系型数据库导入到Hadoop生态系统中&#xff0c;而Kafka则用于数据流的传输和处理。本文将深入探讨如何使用Sqoop与Kafka集成&#xff0c;提供详细的步骤、示例代码和最佳实践&#xff0c;以确…

【UEFI基础】EDK网络框架(TCP4)

TCP4 TCP4协议说明 相比UDP4&#xff0c;TCP4是一种面向连接的通信协议&#xff0c;因此有更好的可靠性。 TCP4的首部格式如下&#xff1a; 各个参数说明如下&#xff1a; 字段长度&#xff08;bit&#xff09;含义Source Port16源端口&#xff0c;标识哪个应用程序发送。D…

2023年12月青少年机器人技术等级考试(三级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;三级&#xff09;理论综合试卷 单选题 第 1 题 单选题 下列选项中&#xff0c;关于光敏电阻描述正确的是&#xff1f;&#xff08; &#xff09; A. 光敏电阻是由导体材料制作而成 B. 光照射光敏电阻时&#xff0c;光照越强…

Python环境下一维时间序列信号的时频脊线追踪方法

瞬时频率是分析调频信号的一个重要参数&#xff0c;它表示了信号中的特征频率随时间的变化。使用短时傅里叶变换或小波变换获得信号的时频表示TFR后&#xff0c;从TFR中估计信号各分量的瞬时频率&#xff0c;即可获得信号中的特征信息。在TFR中&#xff0c;调频信号的特征分量通…

虚拟机将1.15版本的nginx推送到阿里云镜像仓库

1、docker images 2、docker login --usernamealiyun7279061146 registry.cn-shenzhen.aliyuncs.com 3、docker tag 53f3fd8007f7 registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15 docker push registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15

Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机&#xff0c;EGL还是需要了解下的。 可能大多数开发者使用过OpengGL但是不知道EGL是什么&#xff1f;EGL的作用是什么&#xff1f;这其实一点都不奇怪&#xff0c;因为Android中的GlSurfaceView已经将EGL环境都给配置好了&#xff0c;你一直在使用…

网络编程Day6

网络聊天室 服务器 #include <myhead.h> #define SER_IP "192.168.125.64" #define SER_PORT 6666 typedef struct Msg {char user[32]; //用户名int type; //1.登录、2.发消息、0.退出char text[1024]; //消息 } msg_t; typedef struct List {stru…