ROS摄像机标定

文章目录

  • 一、环境准备
  • 二、摄像头标定
    • [2.1 为什么要标定](#2.1 为什么要标定)
    • [2.2 标定前准备](#2.2 标定前准备)
      • [2.2.1 标定板](#2.2.1 标定板)
      • [2.2.2 摄像头调焦](#2.2.2 摄像头调焦)
    • [2.3 开始标定](#2.3 开始标定)
    • [2.4 测试标定结果](#2.4 测试标定结果)
  • 总结
  • 参考资料

一、环境准备

安装usb_cam相机驱动
sudo apt-get install ros-noetic-usb-cam

安装标定功能包
sudo apt-get install ros-noetic-camera-calibration

usb_cam提供了一个launch文件,可以直接roslaunch运行,打开usb_cam_node 和 image_view节点。launch文件在/opt/ros/noetic/share/usb_cam/launch文件夹下。直接在这个目录打开bash然后运行。执行这个命令:
roslaunch usb_cam usb_cam-test.launch

launch文件内容如下:

xml 复制代码
<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="color_format" value="yuv422p" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>

二、摄像头标定

2.1 为什么要标定

普通相机成像误差的主要来源有两部分,第一是相机感光元件制造产生的误差,比如成

像单元不是正方形、歪斜等;第二是镜头制造和安装产生的误差,镜头一般存在非线性的径

向畸变。

在对相机成像和三维空间中位置关系对应比较严格的场合(例如尺寸测量、视觉 SLAM等)就需要准确的像素和物体尺寸换算参数,这参数必须通过实验与计算才能得到,求解参数的过程就称之为相机标定。

2.2 标定前准备

2.2.1 标定板

在执行摄像头标定前,需要先准备一块标定板。

标定板有两种获得方法,第一种是采购成品的标定板,A4纸大小的标定板通常价格在300~400的样子。

如果不想采购,可以使用打印机将下面的文件按照1:1打印在A4纸上,然后贴在一块纯平的版上,例如亚克力板。

打印的标定板缺点在于,第一打印机的精度有限,边缘可能会产生模糊,另外就是在粘贴时很难做到极高的平整度,这两项都会对标定结果产生一定的影响,但是优点时便宜易得。

2.2.2 摄像头调焦

标定只针对手动对焦的相机,自动对焦的相机由于焦距变化,难以形成固定的标定参数。

相机在标定前,需要调整好焦距(拧镜头),使成像清晰,并将当前焦距固定住,防止焦距产生变化。

2.3 开始标定

准备标定板,可以使用这个网站生成标准的棋盘标定pdf,可以截图到平板上当成一块板子。

开始标定,bash中输入:
rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.02 image:=/usb_cam/image_raw
--size是指这个标定板的内角点数量详细说明戳这
--square是指每个小正方形的边长。

运行之后会出现下面这个窗口,然后用你的标定板缓慢各式各样的移动,会发现右边那几个进度条在变化,你要做的就是让这些血条变绿。X表示左右移动,Y表示上下,Size表示远近,Skew表示倾斜

全部绿了之后,会发现CALIBRATE按钮变颜色,然后点击,开始无尽的等待。直到控制台出现你的标定信息,就标定好了。如下图:

测试标定结果,再把标定板拿到镜头,右侧出现了一个数据,叫线性误差,通常这个值小于0.1或者显示acc都可以认为标定结果可用

除此之外,点击SAVE按钮后在/tmp目录下,出现了一个压缩包,这个压缩包存放了标定结果和图片。其中的.yaml就是标定结果,后续会使用。

2.4 测试标定结果

打开你的ros工作目录,在src下创建一个功能包,在这个功能包下创建config和launch目录,config存放刚才的标定结果yaml文件,launch目录存放launch文件,来运行节点。

launch文件内容如下:

xml 复制代码
<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
    <param name="camera_name" value="my_camera"/>
    <param name="camera_info_url" type="string" value="file://$(find bingda_tutorials)/config/ost.yaml"/>
  </node>
</launch>

重要的是后面两个参数,一个是摄像头名称,你自定义,一个是info_url,写你的yaml文件路径

接下来launch一下:

使用echo将camera_info话题输出,可以看到摄像头的标定参数已经加载在话题中了
rostopic echo /usb_cam/camera_info

矫正图像

如果需要使用标定参数矫正图像,可以使用image_proc这个功能包

首先通过apt方式安装

安装完成后运行它,这里加入ROS_NAMESPACE是由于usb_cam这个功能包中发布的话题都带有了/usb_cam这个命名空间,所以为了保证图像和摄像头参数话题能正常的被image_proc节点接收需要给它加上命名空间/usb_cam
ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

再开启两个rqt_image_view,直接终端输入就可以。

左边是校正了的,右边是原生图像。看不出什么区别,广角下就会比较明显

总结

在本实验中,操作了在Ubuntu 20.04上安装ROS并使用相机标定包对摄像头进行标定,了解了具体操作过程。通过进行标定,获取摄像头的内部参数和畸变系数,提高测量精度。

参考资料

让他火!!!神级教程
标定材料
标定教程

相关推荐
阿利同学11 分钟前
ade20k 街景图像【数据集】及其【论文出处】ADE20K数据集 超过25000张图像的语义分割数据集
计算机视觉·数据集·获取qq1309399183·ade20k 街景图像·语义分割数据集
程序员非鱼38 分钟前
深度学习中的损失函数详解
人工智能·深度学习·计算机视觉·损失函数
xuehaisj2 小时前
地图箭头方向检测系统源码分享
人工智能·计算机视觉·目标跟踪
William_Edmund2 小时前
Python 语言学习——应用1.2 数字图像处理(第二节,变换)
人工智能·学习·计算机视觉
人工智能技术咨询.6 小时前
张雪峰谈人工智能技术应用专业的就业前景!
人工智能·学习·计算机视觉·语言模型
獨枭7 小时前
Ubuntu 通过 Docker 搭建 GitLab
ubuntu·docker·gitlab
程序员南飞10 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
BulingQAQ13 小时前
论文阅读:PET/CT Cross-modal medical image fusion of lung tumors based on DCIF-GAN
论文阅读·深度学习·生成对抗网络·计算机视觉·gan
CV-King15 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
禁默15 小时前
2024年计算机视觉与艺术研讨会(CVA 2024)
人工智能·计算机视觉