上手一个RGBD深度相机:从原理到实践--ROS noetic+Astra S(中):RGB相机的标定和使用

news2024/11/15 11:47:53

前言

  • 本教程涉及基础相机的原理,使用,标定,和读取。(注:本教程默认大家有ROS1基础,故不对程序进行详细解释)

  • 上一期:[csdn博客]上手一个RGBD深度相机:从原理到实践–ROS noetic+Astra S(上):解读深度测距原理和内外参推导
    请添加图片描述

  • 距离上一期已经鸽了好久了,上一期我们讲到深度相机结构光测距的原理,同时推导了相机的内参矩阵和外参矩阵,这一期我们来讲讲如何对深度相机的RGB相机进行标定

  • 本教程使用的环境

    • ubuntu 20.04 LTS ROS1 noetic
    • Astra S

1 相机标定

1-1 概念回顾
  • 相机标定(Camera Calibration)是计算机视觉中的一个基本步骤,其目的是确定相机的内参(internal parameters)和可能的外参(external parameters)。内参包括焦距(focal length)、主点(principal point)、畸变系数(distortion coefficients)等,而外参则包括相机的位置和方向。
  • 回顾上一次推导的结果请添加图片描述
1-2 标定板
  • 标定板(Calibration Board)是相机标定过程中使用的物理图案,用于确定相机的内部和外部参数。标定板上的图案可以是棋盘格、圆点或其他可识别的模式。

  • 类型

    • 棋盘格(Chessboard):这是最常用的标定板类型,通常由黑白相间的方格组成。棋盘格的角点易于检测,并且可以提供丰富的特征点用于标定计算。请添加图片描述

    • 圆点(Circle Grid):这种标定板由均匀分布的圆点组成,同样易于检测,并且在某些情况下可能比棋盘格更易于处理。请添加图片描述

    • AprilTag:这是一种特殊的二维码,包含了编码信息,可以用于更高级的相机标定和增强现实应用。请添加图片描述

  • 使用

    • 在相机标定过程中,标定板被放置在已知位置,相机从多个角度拍摄标定板的图像。通过分析这些图像中的特征点,可以计算出相机的内部参数(如焦距、主点和畸变系数)和外部参数(如旋转矩阵和平移向量)。
  • 这里我使用的是现成玻璃材质的标定板
    请添加图片描述

    • 图中左下角有GP400 12*9-30的字样
      • GP400:标定板的型号
      • 12*9:棋盘格的大小,即12行和9列的方格。
      • 30:每个方格的尺寸,30mm
  • 下面我们看看如何使用这个棋盘格对相机的内参矩阵进行标定。


2 camera-calibration

2-1 介绍
  • camera_calibration 是 ROS 提供的一个相机标定工具包,适用于单目和双目相机的标定。它使用棋盘格作为标定板,而非 AprilTag。该工具包基于 OpenCV 的原理,能够方便地估计相机的内部参数(如焦距、主点和畸变系数)和外部参数(如旋转矩阵和平移向量)
2-2 安装
  • 新开一个终端,我们直接安装即可
sudo apt install ros-$ROS_DISTRO-camera-calibration
2-3 RGB标定
  • 老规矩我们连接好相机,打开驱动程序(astra.launch)请添加图片描述

  • 标定程序需要订阅到摄像头话题,回顾上一节的内容,我们需要订阅的是/camera/color/image_raw
    请添加图片描述

  • 运行标定程序

    rosrun camera_calibration cameracalibrator.py --size 8x11 --square 0.030 image:=/camera/color/image_raw
    
    • --size 8x11:注意这里填的不是棋盘格的行列数,是内部角点的行列数请添加图片描述

    • --square 0.030:每一小格的边长

    • image:=/camera/color/image_raw:图像话题

  • 上述程序运行后会弹出如下窗口请添加图片描述

  • 相机类型选择

    • Camera type摄像头类型:,这里我们选择0
      • 0 pinhole针孔
      • 1 fisheye鱼眼
    • scale:比例,设置为1即可
  • 我们来看右侧这四个进度条
    请添加图片描述

    • X:棋盘格在摄像头视野中的左右移动
    • Y:棋盘格在摄像头视野中的上下移动
    • Size:棋盘格在摄像头视野中的前后移动
    • Skew:棋盘格在摄像头视野中的倾斜转动
  • 我们需要不断移动棋盘格,不断采集四个进度条的数据,当数据采集完成时候,CALIBRATE按钮会变色(尽量让四个条都变成绿色)请添加图片描述

  • 依次点击CALIBRATE,标定完成后SAVECOMMIT会亮起,点击SAVE进行保存,点击COMMIT进行提交关闭程序
    请添加图片描述

  • 终端可以看到标定的结果和标定文件保存的位置
    ('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
    请添加图片描述

  • 请添加图片描述

  • 我们打开ost.yaml

image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:
  rows: 3
  cols: 3
  data: [524.2458 ,   0.     , 320.59801,
           0.     , 522.832  , 240.49402,
           0.     ,   0.     ,   1.     ]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.016076, -0.099965, 0.000828, -0.000928, 0.000000]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1., 0., 0.,
         0., 1., 0.,
         0., 0., 1.]
projection_matrix:
  rows: 3
  cols: 4
  data: [519.10468,   0.     , 319.54747,   0.     ,
           0.     , 521.18512, 240.27539,   0.     ,
           0.     ,   0.     ,   1.     ,   0.     ]
  • image_width 和 image_height:即图像的宽度和高度
  • camera_name:这是相机的名称 “narrow_stereo”。
  • camera_matrix:相机矩阵(也称为内参矩阵)描述了相机的内部参数。
  • distortion_model:畸变模型描述了镜头的畸变类型。这里使用了 “plumb_bob” 模型,这是一种简化的径向畸变模型。
  • distortion_coefficients:畸变系数是与畸变模型相关的参数,用于校正镜头的畸变。这里有五个畸变系数:k1, k2, p1, p2, k3。这些系数用于校正镜头的径向和切向畸变。
  • rectification_matrix:校正矩阵用于校正相机的图像,使其更适合于立体视觉应用。在这个例子中,校正矩阵是一个单位矩阵,意味着没有应用特定的几何校正。
  • projection_matrix:
    投影矩阵用于将三维空间中的点投影到二维图像平面上。在这个例子中,投影矩阵与相机矩阵非常相似,但可能包含了一些额外的变换,用于校正图像的几何失真。

2-4 RGB标定使用
  • 根据上一节说的,在ros_astra_camera中,我们可以添加标定的结果到启动文件
<launch>
    <!--...-->
    <arg name="color_info_uri" default="file:///you_depth_camera_calib_path/rgb_camera.yaml"/>
    <!--...-->
</launch>
  • 我们观察以下默认的启动时候调用的默认标定文件请添加图片描述

  • 我们需要修改我们的标定文件摄像机的名字为rgb_camera

image_width: 640
image_height: 480
camera_name: rgb_camera
  • 同时我们修改启动文件的标定文件路径为我们存放标定文件的路径中
<arg name="color_info_uri" default="file:///home/zhlucifer2/ros-bicycle/src/ros_astra_camera/ost.yaml"/>
  • 重新启动相机,可以看到我们的标定文件已经被使用了
    请添加图片描述

小结

  • 本节我们介绍了如何能使用camera-calibration进行RGB相机标定和启动
  • 下一节我们讲讲我们该如何对深度相机进行标定
  • 如有错误,欢迎指出!!!!感谢大家的支持!

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

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

相关文章

面试题给图例举测试用例或测试点

目录 从功能测试的角度考虑&#xff1a; 从性能角度考虑&#xff1a; 从兼容性的角度考虑&#xff1a; 从自动化角度考虑&#xff1a; 从安全性角度考虑&#xff1a; 用户体验的角度测试&#xff1a; 面试通常会有技术和人事两种&#xff0c;侧重点不一样。 今天聊一下测…

初体验《SpringCloud 核心组件Eureka》

文章目录 1.案例准备1.1 案例说明1.2 案例数据库准备1.3 环境搭建1.3.1. 创建一个空的项目1.3.2. 创建Maven工程1.3.3. 配置父工程依赖&#xff0c;SpringCloud版本以及对应的SpringBoot版本1.3.4. 创建公共模块1.3.5. 创建用户模块工程1.3.5.1 引入依赖以及配置文件1.3.5.2 在…

5G 扬帆新质跃,技术蝶变开新篇-第七届“绽放杯”5G应用征集大赛 5G应用融合技术专题赛圆满收官

2024年9月13日,由中国信息通信研究院、中国电信集团有限公司、中国移动通信集团有限公司、中国联合网络通信集团有限公司主办,5G应用产业方阵承办的第七届“绽放杯”5G应用征集大赛  5G应用融合技术专题赛决赛在深圳成功举办。 本次专题赛以“5G扬帆新质跃,技术蝶变开新篇”为…

MyBatisPlus--(插件功能---分页)

4.插件功能 MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有: PaginationInnerInterceptor:自动分页 TenantLineInnerInterceptor:多租户 DynamicTableNameInnerInterceptor:动态表名 OptimisticLockerInnerInterceptor:乐观锁 IllegalSQLInnerInt…

解决Mac下Vscode编译运行C语言程序会自动生成DSYM文件夹的问题

&#x1f389; 前言 好久没写C语言了&#xff0c;今天打开Vscode打算写点程序练练手&#xff0c;结果发现一个让我非常苦恼的事情&#xff0c;那就是每次我运行程序的时候&#xff0c;左侧的资源管理器就会生成一大堆的文件&#xff0c;如图&#xff1a; 强迫症犯了&#xff…

通威股份半年报业绩巨降:销售费用大增,近一年股价跌四成

《港湾商业观察》施子夫 王璐 光伏领域龙头企业通威股份&#xff08;600438.SH&#xff09;交出的半年报延续了2023年营收和净利润双下滑趋势&#xff0c;幅度显得更大。 即便受行业波动影响&#xff0c;但如何重整及提升盈利能力&#xff0c;通威股份还需要给出解决方案。​…

Unreal Engine 5 C++: 编辑器工具编写入门(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…

Linux系统编程(基础指令)上

1.Linux常见目录介绍 Linux目录为树形结构 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&…

科研绘图系列:R语言散点图和小提琴图(scatter plot violin plot)

文章目录 介绍加载R包导入数据数据预处理函数画图系统信息介绍 提取模型的结果并对模型的结果进行可视化。 加载R包 library(ggplot2) library(ggridges) library(patchwork) library(party) library(caret) library(dplyr

惠海H6118 DC-DC 降压恒流芯片30V36v40V48V降12V9V24V36V 1.2A大电流 调光降压芯片IC舞台灯

H6118是一款连续电感电流导通模式的降压型LED恒流驱动器&#xff0c;用于驱动一个或多个LED灯串。H6118工作电压从4V到30V&#xff0c;提供可调的输出电流&#xff0c;最大输出电流可达到1.2A。 H6118内置功率开关管&#xff0c;采用高端电流检测电路&#xff0c;支持PWM模式调…

微信小程序拨打电话点取消报错“errMsg“:“makePhoneCall:fail cancel“

问题&#xff1a;微信小程序中拨打电话点取消&#xff0c;控制台报错"errMsg":"makePhoneCall:fail cancel" 解决方法&#xff1a;在后面加上catch就可以解决这个报错 wx.makePhoneCall({phoneNumber: 181********}).catch((e) > {console.log(e) //用…

win10下使用docker、k8s部署java应用

在上一篇文章 Windows10上Docker和Kubernetes的安装 中&#xff0c;已经介绍了在 Windows10上安装Docker和Kubernetes &#xff0c;有了这个环境基础之后&#xff0c;就可以用来部署服务了 在项目目录下新建Dockfile文件&#xff0c;内容如下&#xff08;请根据实际情况调整&am…

八股文-多线程、并发

八股文-多线程、并发 最近学到了一种方法&#xff0c;可以用于简历项目经验编写以及面试题目的回答 STAR法则&#xff1a;在什么背景下&#xff0c;你需要解决什么问题&#xff0c;你做了啥&#xff0c;得到了什么结果 情境&#xff08;Situation&#xff09;&#xff1a; 描…

Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...

原文链接&#xff1a;https://tecdat.cn/?p37724 在当今世界&#xff0c;粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率&#xff0c;但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时&#xff0c;在学术领域&#xff0c;准确评估…

JDK如何下载源码?

文章目录 JDK如何下载源码&#xff1f;JDK源码介绍下载JDK源码idea配置源码路径 JDK如何下载源码&#xff1f; JDK&#xff08;Java Development Kit&#xff09;是开发Java应用程序的基础工具包&#xff0c;包含了编译、运行和调试Java应用程序所需的所有工具。JDK源码主要指…

notepad++的json查看

json文件查看 因为接触到3dtile模型&#xff0c;所以经常需要和json打交道&#xff0c;但是很多模型是下面这种情况&#xff0c;不好阅读&#xff0c;所以可以使用notepad的插件查看 正常打开是这样的 加载notepad插件 搜索json下载安装就可以了 如果网络抽象&#xff0c;下载…

苹果解锁工具iToolab UnlockGo 中文安装版(附教程+补丁) 2024年6月ios17.4.1可用(记得点赞)解压密码请看文章!!! 评论区获取最新链接

UnlockGo 允许您非常轻松地绕过 iPhone 的密码并获得对设备的完全访问权限。它在以下场景中很有用。 在几分钟内删除 iPhone/iPad 上的各种锁定。 解锁 4 位/6 位密码、Touch ID 和 Face ID 删除没有密码的 iCloud 免费锁 无需密码即可从 iPhone/iPad/iPod 中删除 Apple ID…

手写Spring

简单实现Spring基于注解配置 ComponentScan Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface ComponentScan {String value() default ""; } 相当于component-scan HspSpringConfig ComponentScan(value "spring.write.com…

初始泛型【超级详细哦~】

初始泛型【超级详细哦~】 1、包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和拆箱 2、泛型2.1 什么是泛型2.2 泛型的语法2.3泛型的使用2.4 泛型的上界2.4.1 语法2.4.2 示例 1、包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 int i10;//装箱操作&a…

聊聊Thread Local Storage

聊聊ThreadLocal 为什么需要Thread Local StorageThread Local Storage的实现PThread库实现操作系统实现GCC __thread关键字实现C11 thread_local实现JAVA ThreadLocal实现 Thread Local Storage 线程局部存储&#xff0c;简称TLS。 为什么需要Thread Local Storage 变量分为全…