双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)

2023-05-16

二郎也比较忙,在某大场工作,有时候没有时间回复。
如果希望二郎尽快帮忙,可以将代码,数据和问题发给二郎,谢谢大家理解。
glwang20@mails.jlu.edu.cn
不过还是希望大家自己要好好研究,问二郎太基础性的问题,证明自己没有看过书籍,二郎就有一点点不太想回复了。
首先说明一点,需要用到matlab的stereoCameraCalibrator算法,该算法在2014a版本后添加的,因此之前的版本找不到,所以还是安装一个新版本的吧,我装的2016a。
这里说一下,换2016a可能会遇到打开图片特别慢,这里需要切换一下软件
opengl software(在matlab中执行)
切回硬件
opengl hardware
测试有没有stereo可以输入Enter stereoCameraCalibrator
我们在使用双目相机时,首先需要进行标定(就是相机有误差,我们需要消掉误差,如何消掉?加几个参数调节)

这里还要说明一个问题,有些人询问二郎为啥校正后图像会被截去很多,这里有几个原因:
1)相机畸变较大,两个相机的摆放位置偏差较大,截去较多是正常现象,不影响后期的匹配和距离计算。
2)如果后期出现了问题,则需要考虑是否把高阶畸变参数去掉,k3。
3)相机的摆放位置对其影响较大,应尽可能将两台相机放在同一直线上(光轴平行)。应尽可能避免使用两个性能不同的相机或者参数不一致的相机。

双目标定的流程

在这里插入图片描述
基本上按这个就可得到我们想要的校正双目误差的参数了。
下面强调几点过程中的注意事项
1.拍摄的图片是棋牌格,棋盘格的外围需要是长方形,不能是正方形,要不matlab会报数据错误。
2.在计算完成后注意保存mat
下面是流程图
在这里插入图片描述
然后将上面的“Skew”、“Tangential Distortion”以及“3 Coefficients”等选项选上,将“2 Coefficients”选项去掉(如果在接下来的步骤,你的参数有问题或者校正后的图像对异常,请去掉第三个参数,直接选择2 Coefficirents,因为在我们标定板精度不高时,采用较高的畸变参数可能会出现问题。)(这里图上为了方便直接默认着的):
在这里插入图片描述
Camera1代表左摄像头,Camera2代表右摄像头
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保存后的参数在matlab的文件目录下,关掉该窗口后你就能看到
到这,我们的相机标定就结束了,我们最后得到一个mat文件。
mat文件解释
CameraParameters1为左摄像头的单独标定参数,CameraParameters2为右摄像头的单独标定参数。

stereoParams.TranslationOfCamera2:可以直接使用。
stereoParams.RotationOfCamera2:如需要在其他地方使用该矩阵,需转置以后使用(这里需要注意是用在哪里,转置后只是和我们平常见到的形式保持一致,方便我们分析,如果不导出直接在matlab中应用,多数情况下没有必要转置)。
在这里插入图片描述
CameraParameters1/CameraParameters2内
在这里插入图片描述
RadialDistortion:径向畸变,来源于光学透镜的特性,由K1,K2,K3确定。
TangentialDistortion:切向畸变,相机装配误差,传感器与光学镜头非完全平行,由两个参数P1,P2确定。
参数排序K1,K2,P1,P2,K3。
这里需要把我们的标定结果保存为mat,方便以后应用
save(‘my1stereoParams.mat’ , ‘stereoParams’);

图像校正流程

标定后,图像的校正其实非常简单,只需要代入函数即可

clear all
clc

I1 = imread('zed_left2.png');%读取左右图片
I2 = imread('zed_right2.png');
figure
imshowpair(I1, I2, 'montage');
title('Original Images');

%加载stereoParameters对象。
load('my1stereoParams.mat');%加载你保存的相机标定的mat

[J1, J2] = rectifyStereoImages(I1, I2, stereoParams);
figure
imshowpair(J1, J2, 'montage');
title('Undistorted Images');

立体图像校正将图像投影到共同的图像平面上,使得对应的点具有相同的行坐标。
我们完成了校正之后,我们再进行特征点匹配就能将两张图联系到一起,进而求得距离信息。
很多做法中,校正后需要看一下校正的结果,把第一个图像的红通道和第二个图像的蓝通道和绿通道结合构成图像,可以看出浅浅的叠影,红色的就是我们的图1,其他色的就是我们的图2

figure; imshow(cat(3, J1(:,:,1), J2(:,:,2:3)), 'InitialMagnification', 50);%图像显示50%

或者也可以用二郎写的一个程序,挺有意思的,让两个物体同时显示,利用到(图像融合,边缘提取)

WL1 = abs(imfilter(rgb2gray(J1), fspecial('Laplacian'), 'replicate', 'conv'));
WL2 = abs(imfilter(rgb2gray(J2), fspecial('Laplacian'), 'replicate', 'conv'));
WL1(WL1(:)>=WL2(:)) = 1;WL1(WL1(:)<WL2(:)) = 0;
WL2(WL1(:)>=WL2(:)) = 0;WL2(WL1(:)<WL2(:)) = 1;
J_F(:,:,1) = J1(:,:,1).*WL1+J2(:,:,1).*WL2;
J_F(:,:,2) = J1(:,:,2).*WL1+J2(:,:,2).*WL2;
J_F(:,:,3) = J1(:,:,3).*WL1+J2(:,:,3).*WL2;
figure; imshow(J_F, 'InitialMagnification', 50);%图像显示50%

计算视差图disparity(matlab)

二郎从网上看到好多,然而大部分有点想吐槽,都是罗列一堆公式……让人怎们看……这里二郎整理一下,包括公式解答和计算视差所用的算法(二郎之前也想过,它的计算视差,是已经内嵌了匹配了??往下看吧)

disparityMap = disparity(rgb2gray(J1), rgb2gray(J2), 'BlockSize',... 
'15',DisparityRange',[0,400],'BlockSize',15,'ContrastThreshold',0.5,'UniquenessThreshold',15);

上面的一大串是二郎平时用的,这里先说明一下,该算法的操作对象均为灰度图,因此用到了两个rgb2gray;如何看懂一个函数最主要的是明白它的输入是什么,可设参数是什么,输出是什么。
该函数的输入是

rgb2gray(J1), rgb2gray(J2),

可设参数是

'DisparityRange',[0,400],'BlockSize',15,'ContrastThreshold',0.5,'UniquenessThreshold',15

其中:
’BlockMatching’或’SemiGlobal’:视差估计算法的一种(该种算法为默认算法),通过比较图像中每个像素块的绝对差值之和(SAD)来计算视差。
(块匹配采用了基本块匹配1.Konolige,K。,Small Vision Systems:Hardware and Implementation,Proceedings of the 8th International Symposium in Robotic Research,pages 203-212,1997。或者半全局块匹配2.Hirschmuller, H., Accurate and Efficient Stereo Processing by Semi-Global Matching and Mutual Information, International Conference on Computer Vision and Pattern Recognition, 2005.)

’DisparityRange’,[0,400]:视差范围,范围可以自己设定,不能超过图像的尺寸,当双目距离较远或者物体距离较近时,应适当增大该参数的值。

’BlockSize’, 15:设置匹配时方块大小。

’ContrastThreshold’,0.5:对比度的阈值,阈值越大,错误匹配点越少,能匹配到的点也越少。

’UniquenessThreshold’,15:唯一性阈值,设置值越大,越破坏了像素的唯一性,设置为0,禁用该参数。

’DistanceThreshold’,400:从图像左侧到右侧检测的最大跨度,跨度越小越准确,但很容易造成无法匹配。禁用该参数[]。

’TextureThreshold’,0.0002(默认):最小纹理阈值,定义最小的可靠纹理,越大越造成匹配点少,越少越容易匹配到小纹理,引起误差。

输出是

disparityMap

返回的视差值,以图1为底板,以图2与图1的视差为灰度值。

整体计算的步骤:
1.使用Sobel滤波器计算图像对比度的度量。
2.通过使用块匹配和绝对差值之和(SAD)来计算每个像素的视差。
3.标记包含不可靠的像素 差异值。该函数将像素设置为 - realmax(’ single’)返回的值。

显示 disparityMap

多数情况下该图显示为彩色的更为直观

figure;imshow(disparityMap, [0, 400]);
title('Disparity Map');
colormap jet
colorbar

从视差图中提取三维信息

pointCloud3D = reconstructScene(disparityMap, stereoParams);

这里有两个参数,第一个为我们计算的视差图,第二个是我们利用matlab对两个相机进行标定后的标定文件。这里matlab已经集成,没有文档说明采用的什么策略。
返回的矩阵 pointCloud3D为三维,(:,:,1)x坐标,(:,:,2)y坐标,(:,:,3)z坐标。
这里需要注意,出来的参数类型是single,这里最好转化一下(single占用4个字节、double占用8个字节,single所需空间比double少,但是在特殊场合精度不够。但是matlab中一些自带的优化主要针对的double,虽然single占内存小,但是它并不一定比double快。)

 pointCloud3D = double(pointCloud3D);

还有,我们出来的数的单位均为厘米,因此为了方便,我们需要转化为米来使用

 pointCloud3D = pointCloud3D/100;

显示距离和图像

Z = double(pointCloud3D(:,:,3));
mask = repmat(Z> 5&Z <6,[1,1,3]);
J1(~mask)= 0;
figure;imshow(J1,'InitialMagnification',50);

这里的50指定了显示的时候放大倍数为50%,也就是缩小一半放大。
这里显示的是距离5~6米之间的物体,其他范围的物体都变成了黑色
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,) 的相关文章

  • C语言数据结构——线性表的链式存储结构

    文章目录 线性表的链式存储结构1 基本概念2 设计与实现3 优点和缺点 线性表的链式存储结构 1 基本概念 链式存储定义 xff1a 为了表示每个数据元素与其直接后继元素之间的逻辑关系 xff0c 每个元素除了存储本身的信息之外 xff0c
  • 智能车浅谈——硬件篇

    目录 初识小车硬件系统1 电源系统线性电源开关电源 2 人机交互系统3 MCU最小系统4 传感器系统摄像头电感编码器 5 驱动系统 机械结构 17届完赛代码智能车系列文章汇总 前言 xff1a 作为一名老三本玩家 xff0c 笔者深知一些同
  • 智能车浅谈——图像篇

    文章目录 前言认识图像基本含义图像类型数字图像彩色图像灰度图像黑白图像 小结 图像处理图像压缩二值化固定阈值法大津法 图像降噪 xff08 腐蚀 xff09 寻边线 总结17届完赛代码17届完赛代码智能车系列文章汇总 前言 前面已经记录了智
  • 智能车浅谈——手把手让车跑起来(电磁篇)

    文章目录 前言材料准备备赛组车模硬件 练习组车模硬件方案 整车原理赛道信息获取及转向原理工字电感运放模块转向原理元素判断 电机及舵机控制原理 代码实现效果欣赏总结17届完赛代码智能车系列文章汇总 前言 电磁寻迹小车 之前智能车系列已经做了一
  • 手把手教你OneNET数据可视化

    文章目录 前言OneNET实现数据可视化效果一览发布项目 xff08 5 17更新 xff09 总结 前言 之前介绍了Hi3861使用MQTT协议接入OneNET实现数据的上传以及命令的下发 xff0c 本文主要是介绍一下如何使用OneNE
  • linux---进程间通信(ipc)之管道

    进程间通信方式 管道共享内存消息队列信号量本地套接字等等都能作为我们进程间通信的方法 操作系统提供进程间通信方式的原因 因为对于我们进程来说 xff0c 每一个进程都是相互独立的 xff0c 具有独立性 xff0c 如果我们需要两个不同的进
  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    USART收发字符串及串口中断 前言字符串的收发发送一个字符串接收字符串需求 利用串口实现printf 中断中断是什么串口的接收中断以及空闲中断实现代码实现效果 总结M4系列目录 前言 上一篇中 xff0c 介绍了串口收发相关的寄存器 xf
  • 嵌入式学习笔记——PWM与输入捕获(下)

    输入捕获 前言输入捕获的概述框图输入通道部分比较捕获寄存器与事件生成 寄存器编程思路 实际需求配置流程打开对应的时钟配置GPIO为复用模式定时器的时基部分配置定时器输入通道部分配置定时器中断配置 代码 xff1a 运行效果 xff1a 需求
  • 嵌入式学习笔记——SPI通信的应用

    SPI通信的应用 前言屏幕分类1 3OLED概述驱动芯片框图原理图通信时序显示的方式页地址 列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结M4系列目录 前言 上一篇中介绍了STM32的SPI通
  • 嵌入式学习笔记——IIC通信

    IIC通信 前言IIC概述通信特征物理拓扑结构IIC通信的流程IIC的特点 xff1a STM32的IIC通信GPIO模拟IICIIC的时序组成 xff08 主机对从机写入数据 xff09 1 起始信号2 器件地址与读写位3 从机应答信号5
  • 立创梁山派学习笔记——GPIO输出控制

    梁山派 前言开发板简介GD32F407ZGT6官方资源数据手册1 系统框图2 引脚复用表3 命名规则4 其他 用户手册固件库与PACK包 开发环境搭建立创官方的资料包资料齐活 xff0c 开发1 工程搭建2 使用寄存器点亮LEDGPIO数量
  • C51_day5:串口通信UART

    3 1 串口基本认知 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指
  • 哈希表/哈希冲突及解决方法(较全)

    哈希表的概念请参阅他人文章 xff0c 关于哈希冲突的解决这篇文章基本都整理到了 xff0c 还有几个常见的面试题 解决hash冲突的几种方法 前导 xff08 题外话 xff09 xff1a 一 开放定址法 xff08 闭散列 xff09
  • 关于构造函数,拷贝构造函数,析构函数的调用顺序(1)

    导言 对象是由 底层向上 开始构造的 xff0c 当建立一个对象时 xff0c 首先调用基类的构造函数 xff0c 然后调用下一个派生类的构造函数 xff0c 依次类推 xff0c 直至到达派生类次数最多的派生次数最多的类的构造函数为止 因
  • vector的内存释放

    xff11 vector内存分配机制 C 43 43 中vector的一个特点是 xff1a 内存空间只会增长 xff0c 不会减小 即为了支持快速的随机访问 xff0c vector容器的元素以连续方式存放 xff0c 每一个元素都挨着前
  • MFC多人在线聊天室

    我已经在我的资源里上传了这个聊天室的代码了 基于MFC的C 43 43 的select模型的TCP聊天室 采用select网络模型 xff0c 支持多人同时登陆 xff0c 功能有上线 下线 群聊 私聊 使用CjsonObject进行数据传
  • linux---进程间通信(ipc)之共享内存

    前面我们讲解了进程间通信之管道 xff0c 这段我们讲解我们的共享内存 共享内存是所有进程间通信方式最快的一种 内存共享模型就像下面的图一样 xff0c 就是将物理内存映射到我们进程的虚拟地址上 xff0c 我们就可以直接操作我们虚拟地址空
  • Effective C++总结

    explicit关键字 C 43 43 中的explicit关键字只能用于修饰只有一个参数或者是其他参数有默认值的类构造函数 它的作用是表明该构造函数是显式的 而非隐式的 跟它相对应的另一个关键字是implicit 意思是隐藏的 类构造函数
  • 计算机网络(5)TCP之重传机制

    重传机制 超时重传数据包丢失确认应答丢失 快速重传SACKD SACK例一 ACK 丢包例2 xff1a 网络延时 TCP 是通过序列号 确认应答 重发控制 连接管理以及窗口控制等机制实现可靠性传输的 TCP 实现可靠传输的方式之一 xff
  • 中断与回调

    1 xff0c 回调函数 回调函数的原理是使用函数指针实现类似 软中断 的概念 比如在上层的两个函数A和B xff0c 把自己的函数指针传给了C xff0c C通过调用A和B的函数指针达到 当做了什么 xff0c 通知上层来调用A或者B 的

随机推荐

  • CUDA 程序的优化(3) 任务划分

    4 3 1任务划分原则 首先 xff0c 需要将要处理的任务划分为几个连续的步骤 xff0c 并将其划分为CPU端程序和GPU端程序 划分时需要考虑的原则有 列出每个步骤的所有可以选择的算法 xff0c 并比较不同算法在效率和计算复杂度上的
  • C++ Matlab混合编程时“函数或变量 ‘matlabrc‘ 无法识别”

    在QT中调用Matlab初始化时 xff0c 出现了 函数或变量 matlabrc 无法识别 的情况 xff0c 接着崩溃 而且比较神奇的是 xff0c 前一次是可以初始化的 xff0c 但运行过程中发生了崩溃 直接搜解决办法 xff0c
  • Notepad++全选一整列的靠谱办法

    遇到行数较少的可以直接按住ALT手动选取 xff0c 但遇到行数较多 xff0c 就得这么干 xff1a 鼠标放在第一行某一列 xff0c 按住Alt 43 Shift xff0c 然后鼠标选择最后一行该列 xff0c 输入内容即可 xff
  • 对象转xml格式工具类

    import com ruiyun gui store haikang haikang bean FCSearchDescription import com ruiyun gui store haikang haikang bean FD
  • 【无标题】MQ静态图片获取

    public void getImageV40 String path Integer buildingProjectId HttpServletResponse response JSONObject param 61 new JSONO
  • 数据加解密时Base64异常:Illegal base64 character 3a

    现象 用base64工具类对中文进行处理时出现异常 xff0c 在数据加解密场景中经常使用 java lang IllegalArgumentException Illegal base64 character 3a at java uti
  • Winsock编程实例---TCP&UDP

    0x1 基于TCP的通信 1 服务端 1 1 创建基本流程 创建一个TCP服务端的程序需要调用的函数流程 xff1a 初始化函数库 gt gt WSAStartup 创建套接字 gt gt socket 绑定套接字 gt gt bind 监
  • 数据结构---选择排序(直接选择排序和堆排序图解)

    选择排序思想 xff1a 每一次从待排序的数据元素中选出最小 xff08 或最大 xff09 的一个元素 xff0c 存放在序列的起始位置 xff0c 直到全部待排序的 数据元素排完 直接选择排序 在元素集合array i array n
  • Java HttpUtils类

    Java HttpUtils类 Java HttpUtils类 定义 Public class HttpUtils 收集HTTP Servlet使用的静态的有效方法 方法 1 getRequestURL public static Stri
  • Ubuntu打造家用NAS三——网盘与影视中心

    Ubuntu打造家用NAS三 网盘与影视中心 一 Ubuntu 挂载硬盘 通过 Putty 连接 NAS查看硬盘位置 xff1a sudo fdisk l找到需要挂载的硬盘 xff0c 我的是 Disk dev sdb xff1a xxx
  • Ardupilot笔记:Rover auto模式下的执行流程

    先从mode auto cpp的update 开始分析 流程如图 xff1a 进入函数update 后会执行函数navigate to waypoint mode auto cpp span class token keyword void
  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • c语言---宏

    宏 1 仅仅替换 2 不能定义宏参类型 3 不会检查宏参有没有定义 定义带参数的宏 define JH a b t t 61 a a 61 b b 61 t xff0c 对两个参数a b的值进行交换 xff0c 下列表述中正确的是 xff0
  • Ros安装rosdep update出错,解决办法(从根本入手)

    博主作为一个ros刚入门的新手 xff0c 之前也安装过ros ros2但是在Ros安装在进行rosdep update 时运气与网络是成功的关键 xff0c 在尝试了好多次 xff0c 运气好一次就成功了 xff0c 运气不好得不停的试错
  • vscode使用方法

    01 ctrl 43 u 返回上一个光标焦点 02 发送请求插件 到VSCode插件中搜索REST Client 搜索到 xff0c 点击install进行安装 创建一个 http文件 编写测试接口文件 右键选择 发送请求 xff0c 测试
  • 自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3

    参考学习网站 xff1a https google cartographer ros readthedocs io en latest 问题提出 xff1a 四旋翼搭载激光雷达A3进行SLAM室内定位 xff0c 其怎样Running Ca
  • C#串口通信中的奇偶性校验、CRC校验函数

    一般来说 xff0c 通信协议中的通用数据格式是 包头 43 指令码 43 数据长度 43 有效数据 43 校验码 43 包尾 其中 xff0c 校验方式有多种 xff0c 最流行的是CRC校验方式 xff0c 其次是简单的奇偶性校验 校验
  • 测试软件安装步骤

    目录 Ja 目录 Java安装 jdk下载 jdk环境配置 phpstudy安装 禅道的安装 xampp安装 postman安装 requests parameterized jmeter安装 JVM监控 Locust SecureCRT软
  • linux---进程信号

    进程的功能以及概念信号的生命周期以及相关的接口自定义信号的捕捉流程信号集以及阻塞信号集了解一个SIGCHLD信号 信号的功能以及概念 信号的功能 xff1a 信号就是通知我们某一个事件的发生 信号的概念 xff1a 信号就是一个软件中断 x
  • 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)

    二郎也比较忙 xff0c 在某大场工作 xff0c 有时候没有时间回复 如果希望二郎尽快帮忙 xff0c 可以将代码 xff0c 数据和问题发给二郎 xff0c 谢谢大家理解 glwang20 64 mails jlu edu cn 不过还