MATLAB张正友标记法对双目摄像头进行标定

2023-10-30 04:50

本文主要是介绍MATLAB张正友标记法对双目摄像头进行标定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一步、安装MATLAB

我这里使用的版本是MATLAB R2016a
具体软件自己去度娘找哈
破解就花费了我大半天

第二步、去打印标定要用到的棋盘

这里可以给你(有点小水印无伤大雅)

在这里插入图片描述

用A4纸打印出来

第四步、主角—双目摄像头

奉劝大家不要贪小便宜哈,得买个一百来块的,要不然数据极度不准确,而且还难用
我买了这个,150

在这里插入图片描述

第五步、测试双目摄像头

打开你们可爱的pycharm
安装opencv
写入代码

import cv2video = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
width = 2560
high = 720
mid = width // 2
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, high)w = video.get(cv2.CAP_PROP_FRAME_WIDTH)
h = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
while True:ret, frame = video.read()cv2.waitKey(10)left_img = frame[:, :mid]right_img = frame[:, mid:]cv2.imshow("left_img", left_img)cv2.imshow("right_img", right_img)

当你看到两个窗口弹出的时候,说明双目摄像头测试成功了

第六步、拍标定图

来来来、复制代码


import cv2video = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
width = 2560
high = 720
mid = width // 2
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, high)w = video.get(cv2.CAP_PROP_FRAME_WIDTH)
h = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
index=1
index2=1
while True:ret, frame = video.read()left_img = frame[:, :mid]right_img = frame[:, mid:]cv2.imshow("left_img", left_img)cv2.imshow("right_img", right_img)k = cv2.waitKey(1) & 0xFFif k == ord('a'):cv2.imwrite("left"+str(index)+".jpg", left_img)print("success index="+str(index))index=index+1if k == ord('s'):cv2.imwrite("right"+str(index2)+".jpg", right_img)print("success index2="+str(index2))index2=index2+1

以上代码实现了
按下a键就左目拍照
按下s键就右目拍照
左右目各拍20张标定图

在这里插入图片描述

第七步、使用MATLAB中的标定工具

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

一次性导入20张左目的照片

在这里插入图片描述

这里填棋盘的宽度,我是A4纸打印的是24mm(尺子量的)
具体需要你们去亲自量一下啦

在这里插入图片描述

等待MATLAB计算好就行啦

在这里插入图片描述

标点计算完了就会告诉你有多少个是可以用的,有多少个是无效的图像

在这里插入图片描述

第七步、计算相机数据值

点击Calibrate按钮就可以开始计算啦
在这里插入图片描述
计算完毕就会看到你的相机的位置
上面的柱形图就是每个图片的误差
在这里插入图片描述

!!!!!
我的有效图像居然只有七张!!!而且误差均值居然到了1.15!!!

重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!

后来才发现1.15真的不高,在做了N次后发现1.15居然是最低的!!!
有些网站说误差需要小于0.5才可以通过,我有时候的误差可以到6!!经常性会到2点几
最后这次我做了有一点几,就果断导出数据了

按这个按钮导出到控制台
在这里插入图片描述
然后就可以看到左目相机的数据
在这里插入图片描述
接下来要看相机的内参矩阵,径向畸变和切向畸变。

内参矩阵

cameraParams.IntrinsicMatrix

在这里插入图片描述
径向畸变

cameraParams.RadialDistortion

在这里插入图片描述
切向畸变

cameraParams.TangentialDistortion

在这里插入图片描述

第八步、重做以上步骤,测试右目相机的参数

右目相机的误差在1.3其实还行
!!!为什么我总是到不了1.0以下

在这里插入图片描述
导出数据
在这里插入图片描述
在这里插入图片描述

第九步、完成!

以下就是这次标定的所有数据
下一章将使用双目摄像头测出的数据填入到代码中,再使用立体矫正以及立体匹配,这样就可以得到深度图,使用深度图再进行视差运算,得到视差图。测距测试!!

在这里插入图片描述

可能遇到的问题

  • 点击计算按钮后出现这个对话框

在这里插入图片描述
来我们翻译一下(百度翻译的,正所谓冤有头…)

Unable to estimate camera parameters. Images may contain severe lensdistortion or the 3-D onentations of the cabra tion pattem are toosimilar across images. If calibration pattem onentations are toosimilar, try removing very simar images or adding additional images withhe pattem in varied orientations

无法估计摄像机参数。图像中可能存在严重的透镜畸变,或者图像中的三维结构模式过于相似。如果校准模式的组成非常相似,尝试删除非常simar图像或添加其他图像与模式在不同的方向

  • 标定的误差值非常大 >3

在这里插入图片描述

这篇关于MATLAB张正友标记法对双目摄像头进行标定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

三色标记(Tri-color marking)

维基百科部分 原文 https://en.wikipedia.org/wiki/Tracing_garbage_collection#TRI-COLOR Because of these performance problems, most modern tracing garbage collectors implement some variant of the tri-color ma