opencv 通过网络连接工业相机_相机标定与测距

2023-11-13

0 概述

硬件:Realsense D435i(含imu)、AprilTag或棋盘格标定板(本文均使用棋盘格)

说明:本文非手把手教你如何教程,需要一定的ROS基础和D435i相机调试基础,当然玩过其他相机也可以。写作过程参考了部分作者成果,如有侵权,请联系删除。

标定主要包括四部分内容:

  1. 为什么要做相机标定
  2. 利用Kalibr对D435i进行相机标定、相机-imu标定
  3. 利用opencv对D435i的RGB相机进行内参标定(Opencv也可实现)
  4. 利用opencv对D435i的RGB进行外参标定(单目测距的基础)

1 为什么要做相机标定?

这里涉及四个坐标系世界坐标系、相机坐标系、图像物理坐标系、图像像素坐标系,在由世界坐标系变换到像素坐标系的过程,就涉及到这四个坐标系的变换,具体如下:

世界坐标系与相机坐标系之间的变换

相机坐标系与图像物理坐标系之间的变换

图像物理坐标系与图像像素坐标系之间的变换

通过上述变换,可得物理世界坐标系与图像像素坐标系之间的变换公式如下:

坐标变换总图

2 Kalibr相机标定

ROS 录制bag包

roslaunch realsense2_camera rs_camera.launch

可视化单目影像

这个仅作为摄像头的图像查看,不用这个也不影响标定

rqt_image_view

影像 topic 重新发布(修改发布频率)

使用ros自带的topic_tools工具即可,这个工具很给力,有空看看它的源代码写法,自己原先写过一个类似功能的,结果问题不少。

rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /image_raw

后面三个参数为:源话题名称, 重新发布频率, 重新发布的话题名称

影像包录制

rosbag record /image_raw

标定板和相机相对运动方式:绕x y z轴旋转三次、平移三次。Ctrl+c停止录制后,可使用如下命令查看包信息,尤其关注下时间长度,因为后面标定的时候最好设定下起止时间,

rosbag info 包名称

配置Kalibr标定板参数

这里需要特别注意两点:

  • 标定板的类型不同,配置文件也不同,此处使用棋盘格(可以正常使用),aprilgrid的配置没测试
  • 这里的8和6是内部角点的数量,也就是四个方块的交点,标定板最外侧那种两块交点不算

checkerboard.yaml文件如下:

# example for checkerboard
target_type: 'checkerboard' 
targetCols: 8
targetRows: 6
rowSpacingMeters: 0.055
colSpacingMeters: 0.055   # size of the one chessboard square [m]

# example for aprilgrid
target_type: 'aprilgrid'
tagCols: 8
tagRows: 6
tagSize: 0.055
tagSpacing: 0.3    # 这个参数不太清楚

启动Kalibr进行相机标定

注意更换为自己的配置文件名、Topic名等,

kalibr_calibrate_cameras --target checkerboard.yaml --bag 录制包名称.bag --bag-from-to 5 98 --models pinhole-radtan --topics /image_raw 
  • 这里的 5 98 是使用录制包的起止时间(秒为单位)
  • 如果卡住了,在后面加上 --show-extraction --approx-sync 0.04
  • 如果上面还不行,使用终极解决办法:找到src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras中的如下代码,然后注释掉
if not graph.isGraphConnected(): 
    obsdb.printTable() 
    print "Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance." 
    graph.plotGraph() 
    sys.exit(-1)

结果会生成三个文件,重点关注yaml文件

3 相机-IMU标定

很多步骤和上面一致就不细说,只列出有这个步骤

启动相机Realsense节点

启动前要打开 rs_camera.launch 这个文件,确保“enable_gyro”和“enable_accel”均设置为True

可视化相机影像

相机与IMU的Topic重新发布

rosrun topic_tools throttle messages /camera/color/image_raw 20.0 /image_raw
rosrun topic_tools throttle messages /camera/accel/samples 200.0 /imu
  • 有的可能是/camera/accel/sample,也就是后面不是samples
  • 千万注意 imu对应的topic是/camera/accel/samples,陀螺仪对应的是/camera/gyro/samples,不要搞混了

相机与IMU包录制

rosbag record /image_raw /imu

配置Kalibr标定板,相机和IMU参数

这里需要三个文件:

  • 描述标定板信息的yaml文件,见上面的checkerboard.yaml文件
  • 描述相机内参的文件 camchain-xxx.yaml (上一步标定生成文件)
  • IMU的参数文件(主要包含噪声密度和随机游走),有的参数根据具体传感器修改下,D435i的参数示例如下

imu.yaml文件内容如下:

#Accelerometers
accelerometer_noise_density: 2.64e-02   #Noise density (continuous-time)
accelerometer_random_walk:   7.21e-04   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     3.18e-03   #Noise density (continuous-time)
gyroscope_random_walk:       3.07e-05   #Bias random walk

rostopic:                    /imu      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

启动Kalibr进行相机标定

kalibr_calibrate_imu_camera --target 标定板位置/标定板名称.yaml --cam 相机标定位置/相机标定名称.yaml --imu imu.yaml --bag 录制包名称.bag --bag-from-to 5 98 --show-extraction

标定完成后,会得到四个文件,重点看camchain-imu和results-imucam,表示的都是相机和IMU之间的变换关系

4 相机标定之Matlab和Opencv——内参标定

4.1 Matlab标定内外参数

  • 2016a版本的matlab中 Camera_Calibrator 界面跟以前不太一样了,有的图像可能无法使用,也就是无法add进去
  • 注意标定后直接把外参也就是R T也输出了,特别注意这里旋转矩阵和平移向量是相机坐标系在世界坐标系的描述
  • 重投影误差一般在0.5个pixel之内
  • matlab求得的内参矩阵与opencv求得的内参矩阵是转置关系

标定后的结果(含重投影误差和相机图像相对位置示意图)

生成的标定结构体数据(标定结果都在这里)

详细的参数说明参见链接 matlab 相机标定结果解析_JennyBi的博客-CSDN博客。

4.2 opencv标定之内参标定

代码参加以下地址:

https://github.com/lochinasc1017/PycharmProjects/blob/master/camera_calibration/internal_param_calibration.py​github.com

找不到可以看这个作者的连接:

opencv(八):相机标定_weixin_44524040的博客-CSDN博客​blog.csdn.net

5 单目测距

这里用到opencv的外参标定,代码参见

https://github.com/lochinasc1017/PycharmProjects/blob/master/camera_calibration/external_param_calibration.py​github.com

或者看这里

opencv(九):相机标定--已知内参求外参_weixin_44524040的博客-CSDN博客​blog.csdn.net

有几点需要特别注意的:

  • 这里标定的外参就是棋盘格相对相机的姿态,即求出这张棋盘格的外参,也就是最上面相机成像模型中的R T
  • 在由像素到世界坐标的变换中,注意最后的方程式求解是求解线性方程组,通过 u和v求解在棋盘格定义的世界坐标系下的x y z(这里z=0)

整个过程折腾了我一天多,主要问题出在两个地方:

  • 外参标定的RT结果到底是哪个相对于哪个坐标系的变换
  • 在求像素到棋盘格定义的世界坐标系的过程中,变换出错(把u v错代入x y直接计算Zc),错误计算如下:

原理公式如下:

参考链接:

http://zhaoxuhui.top/blog/2020/09/29/intel-realsense-D435i-calibration-kalibr.html​zhaoxuhui.top
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 通过网络连接工业相机_相机标定与测距 的相关文章

  • 区块链运作机制_区块链如何运作? 铂 4

    区块链运作机制 This article was originally published on Blockchain Review Thank you for supporting the partners who make SitePo
  • native2ascii简单用法

    生成属性文件 native2ascii encoding utf 8 i18n txt zh CN properties 反向生成编辑 native2ascii reverse encoding utf 8 i18n securityNew
  • python算法中的数学算法(详解下)

    目录 一 学习目标 二 学习内容 数值优化 均值 方差 协方差
  • Android Studio 提交项目到新的Git地址 怎么修改

    原文地址 http blog csdn net sunsteam article details 73478045 方法有三种 1 修改命令 git remote set url origin url 例如 Git remote set u
  • switch响应不了服务器,switch链接不到服务器

    switch链接不到服务器 内容精选 换一换 在本章节中 您将运行已部署好的游戏 登录游戏客户端 已准备好Windows机器 硬盘至少20G 且必须安装有显卡 服务器地址 节点的弹性IP地址 请登录CCE控制台 单击左侧导航栏资源管理 gt
  • MobaXterm连接局域网的虚拟机

    MobaXterm 一款集万千于一身的全能型终端神器 优点 1 功能十分强大 支持SSH FTP SFTP Telnet VNC X server等功能 2 支持标签 切换十分方便 3 众多快捷键 操作十分方便 4 支持多窗口 可以同步操作
  • 关于POSTMAN无法安装的解决方法

    1 安装Postman Postman下载地址 https app getpostman com app download win64 点开后会自动下载最新版的Postman 如果链接打不开或者很慢也可以上百度去下载 版本旧一点没关系 安装
  • 当安装好Node.js时,查看npm -v报错的解决方法

    1 下载node js的16版本的时候会遇到报错npm WARN config global global local are deprecated Use location 如何解决 解决方法 1 找到安装node js目录下的npm c
  • 【vue】Element ui 表格的header 标题文字过于太长 而需要显示省略号并用tooltip显示全部信息

    有时候如果table的header的内容太多而页面的宽度有限 这个时候需要将多长的文字隐藏起来 显示省略号并用弹窗显示全部信息 这时候可以使用render header这个属性 自定义生成header 看下面的代码
  • awk 内置函数详解

    原文地址 http www 361way com awk builtin function 4935 html 本文承接上篇 linux awk 内置变量 本篇总结下awk内置函数 awk内置函数主机分为如下几种 数学函数 字符串函数 时间
  • ‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

    问题展示 问题原因 telnet 是微软自带的一个服务 不需要你安装 所以 是你的服务没有开启 解决方法 控制面板 程序 启用或关闭Windows功能 找到 Telnet客户端 勾选并确定即可 重新打开 cmd 输入 telnet 会发现不
  • 解决IDEA重新新建项目时的设置初始化问题,以及IDEA解析项目时间长问题

    直接说重点 之所以每次在setting中设置后 然后新建项目 设置的内容就会初始化 导致每一次新建项目都需要重新setting中设置 解决办法 点击close project 回到IDEA的主界面 然后如图所视设置的便是全局设置 以后新建项
  • 基于鲸鱼算法优化支持向量机的分类预测

    基于鲸鱼算法优化支持向量机的分类预测 支持向量机 Support Vector Machine SVM 作为一种强大的分类器 已经被广泛应用于各个领域 然而 针对SVM应用于大规模和高维数据集时 其计算复杂度往往会变得非常高 导致其难以快速
  • 华为OD机试真题- 微服务的集成测试【2023Q1】【JAVA、Python、C++】

    题目描述 现在有n个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身启动加载会消耗一些时间 给你一个 nxn 的二维矩阵 useTime 其中 useTime i i 10 表示服务 i 自身启动加载需要消耗10s
  • Zabbix5.0设置模板 (超详细解析)

    zabbix部署请见上一篇文章 http t csdn cn yF1JG 一 zabbix模板 模板概述 Zabbix为用户提供了很多开箱即用的模板 具体模板可通过配置 模板查看 模板大概分类如下 网络设备的标准化模板 对交换机和路由器等网
  • OSD full/nearfull 的解决办法

    总结 1 所有整个集群都是full状态 需要添加新osd或删除不必要内容 2 部分osd处于full状态 首先通过调节near full值 使osd能够读写 再调节osd的weight权重 使其能够把数据写到空间较大的osd 0 说明 个人
  • JPEG原理详解(附python实现)

    前言 图片压缩有多重要 可能很多人可能并没有一个直观上的认识 举个例子 一张800X800大小的普通图片 如果未经压缩 大概在1 7MB左右 这个体积如果存放文本文件的话足够保存一部92万字的鸿篇巨著 红楼梦 现如今互联网上绝大部分图片都使
  • 让我们看看xargs做了什么事情?

    说到xargs 不得不提到 find 和 grep 当然了少不了管道 find 和 grep我经常会搞混掉这两个功能很相似的命令的用法 总是会记不太住怎么用 也借此文章加深一下记忆 find xx xx name abc v grep r
  • 23 岁那年你正处在哪个状态?现在呢?

    23 岁那年你正处在哪个状态 现在呢 我 23岁 应届毕业生 生活 工作 爱情都处于人生的低谷 一穷二白 一无所有 一事无成 分享一下成长的建议吧 匿名用户 23岁那年 就是去年 在22岁的时候我毕业 同时第二年准备考研 结果因为压力太大

随机推荐