当前位置: 首页 > article >正文

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

前言

  • 本教程涉及基础相机的原理,使用,标定,和读取。(注:本教程默认大家有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.kler.cn/news/314383.html

相关文章:

  • Tomcat 后台弱⼝令部署war包
  • 迪杰斯特拉算法
  • Git clone远程仓库没有其他分支的问题
  • 拥控算法BBR入门1
  • Matplotlib绘图基础
  • python简单的小项目-关于央行储蓄占比情况的数据可视化
  • Apache Iceberg 试用
  • 无人机几种常见的避障系统!!!
  • Python介绍
  • python爬虫初体验(一)
  • TSRPC+Cocos
  • nginx upstream转发连接错误情况研究
  • 机器学习04-逻辑回归(python)-02原理与损失函数
  • 漫谈由标准输入\输出\错误输出引发的思考
  • AI Prompt写作指南:打造高效Prompt的四大核心元素
  • 游戏服务器知识
  • Qt 常用数据类型
  • (笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数
  • 【学习笔记】STM32F407探索者HAL库开发(五)F407时钟系统配置
  • 好用的工具网址
  • STM32单片机与SU-03T联动(语音播报传感器数据)
  • Docker Networking Tutorial (Bridge - None - Host - IPvlan - Macvlan )
  • TCP/IP协议详解:现代网络通信的基石
  • Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
  • CSS 的元素显示模式简单学习
  • stack和queue(一)
  • 网络信息传输安全
  • R18 Enhancements on CHO procedure for NES cell(s)(NES event)
  • Linux相关概念和重要知识点(5)(权限的修改、时间属性)
  • 蓝桥杯【物联网】零基础到国奖之路:七. 串口