【ZED】从零开始使用ZED相机(四):双目相机标定(MATLAB+张氏标定法)

2024-01-20 08:20

本文主要是介绍【ZED】从零开始使用ZED相机(四):双目相机标定(MATLAB+张氏标定法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

【ZED】从零开始使用ZED相机导航:
【ZED】从零开始使用ZED相机(一):windows下的安装配置与测试
【ZED】从零开始使用ZED相机(二):打开相机+捕获图像
【ZED】从零开始使用ZED相机(三):相机标定(张氏标定法)
上一篇博客介绍了利用ZED相机捕获棋盘格图像(仅保存左图),并利用一系列的.py脚本实现了单目相机的标定,那么如何实现双目相机的标定?目前matlab软件就有现成的双目相机的标定方法,在自定义.py脚本实现双目标定之前(其实目前笔者还未实现)不妨先试试现有的标定软件(如果比较着急用的话)

1 安装MATLAB

MATLAB是一款商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
直接附上安装的参考链接:https://mp.weixin.qq.com/s/LAatgqNf55zpxzOYlpn8fg

在这里插入图片描述

2 获取双目的棋盘格图像

这里笔者分享下标定图像,简单的直接打印棋盘格图像(如果需要更高的精度可能需要购买或者定制标定板)
链接:https://pan.baidu.com/s/199uPaKDCptc4rgG1wIg-wg?pwd=lian
提取码:lian
利用ZED的SDK以及自定的代码实现双目图像的捕获(代码和上篇博客基本一致,些许修改)

"""
2022.02.02
author:alian
ZED相机的二次开发:双目相机标定
"""
import pyzed.sl as sl
import cv2
import numpy as npclass CameraZed2:def __init__(self,resolution=None,fps=30,depthMode = None):self.zed = sl.Camera()self.input_type = sl.InputType()self.init_params = sl.InitParameters(input_t=self.input_type)# 设置分辨率if resolution == "2K":self.init_params.camera_resolution = sl.RESOLUTION.HD2Kelif resolution == "1080":self.init_params.camera_resolution = sl.RESOLUTION.HD1080else:  # 默认self.init_params.camera_resolution = sl.RESOLUTION.HD720self.init_params.camera_fps = fps  # 设置帧率# 设置获取深度信息的模式if depthMode == "PERFORMANCE":self.init_params.depth_mode = sl.DEPTH_MODE.PERFORMANCEelif depthMode == "QUALITY":self.init_params.depth_mode = sl.DEPTH_MODE.QUALITYelse:self.init_params.depth_mode = sl.DEPTH_MODE.ULTRAself.init_params.coordinate_units = sl.UNIT.MILLIMETER  # 单位毫米# 打开相机err = self.zed.open(self.init_params)if err != sl.ERROR_CODE.SUCCESS:print(repr(err))self.zed.close()exit(1)self.runtime = sl.RuntimeParameters()self.runtime.sensing_mode = sl.SENSING_MODE.STANDARDself.savepath = ''  # 标定图像保存的路径def grab_imgs(self):  # 捕获左右图像用于相机标定(文件夹自动创建)img_l = sl.Mat()img_r = sl.Mat()num = 0# 自动创建保存文件夹(分别存放左图和右图)import timename = time.strftime("%Y-%m-%d-%H-%M", time.localtime())self.savepath_L = './images/%s/L' % nameself.savepath_R = './images/%s/R' % nameos.makedirs(self.savepath_L,exist_ok=True)os.makedirs(self.savepath_R,exist_ok=True)while True:if self.zed.grab(self.runtime) == sl.ERROR_CODE.SUCCESS:self.zed.retrieve_image(img_l,sl.VIEW.LEFT)self.img_l = img_l.get_data()self.zed.retrieve_image(img_r,sl.VIEW.RIGHT)self.img_r = img_r.get_data()view = np.concatenate((self.img_l,self.img_r),axis=1)cv2.imshow('View',cv2.resize(view,(1920,540)))key = cv2.waitKey(1)if key & 0xFF == ord('s'):  # 按S同时保存左右图像savePath_L = os.path.join(self.savepath_L, "L{:0>3d}.png".format(num))print(savePath_L)cv2.imwrite(savePath_L, self.img_l)savePath_R = os.path.join(self.savepath_R, "R{:0>3d}.png".format(num))cv2.imwrite(savePath_R, self.img_r)num +=1if key & 0xFF == 27:  # 按esc退出视图窗口break

调用函数:

if __name__ == "__main__":cam = CameraZed2(resolution='1080',fps=30)cam.grab_imgs()  # 获取标定图像(左、右图)

在这里插入图片描述
在这里插入图片描述

3 开始标定

首先打开MATLAB双目标定工具
在这里插入图片描述
分别选择左右图所在文件夹
在这里插入图片描述

在这里插入图片描述
进行角点检测
在这里插入图片描述
在这里插入图片描述
显示角点检测的结果
在这里插入图片描述
点击校正后显示如下:
在这里插入图片描述
导出校正后的参数:
在这里插入图片描述
在MATLAB主界面显示如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上得到相机标定的参数,但是此次标定还是比较粗略的,笔者尝试几种不同的拍摄角度(固定相机,改变标定板的位姿),得到的标定误差都不一样,因此是否有更好的拍摄位姿?还需进一步研究。

4 标定板的尝试

打印的标定板用于测试还尚可,但是要获得准确的相机内外参数就远远不够了。实现高精度的标定板需要能够防止外界关对相机成像的影响,导致成像结果照片变黑或者反光,因此带有光源的背光板是最好的选择,打印上定制的棋盘格图案,但是越好的标定板也越贵,如铝基板一块可能就得上千了,
带有光源的背光板?ipad是不是可以作为显示棋盘格的背光板呢?并且还自带光源。于是笔者如下尝试如下:
在这里插入图片描述
需要注意的是,要先测量好单元格的尺寸,笔者测量的尺寸是20mm,接着按照上述的步骤进行标定,获得结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综上,利用MATLAB标定工具实现了双目相机的粗略标定,更加高精度的标定还需进一步研究。

这篇关于【ZED】从零开始使用ZED相机(四):双目相机标定(MATLAB+张氏标定法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625353

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se