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并使用相机标定包对摄像头进行标定,了解了具体操作过程。通过进行标定,获取摄像头的内部参数和畸变系数,提高测量精度。

参考资料

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

相关推荐
是十一月末9 分钟前
Opencv实现图片的边界填充和阈值处理
人工智能·python·opencv·计算机视觉
明 庭3 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
猿小蔡-Cool3 小时前
ubuntu20.04安装imwheel实现鼠标滚轮调速
ubuntu
Eric.Lee20213 小时前
Paddle OCR 中英文检测识别 - python 实现
人工智能·opencv·计算机视觉·ocr检测
过过过呀Glik3 小时前
在 Ubuntu 上安装 MySQL 的详细指南
mysql·ubuntu
audyxiao0014 小时前
AI一周重要会议和活动概览
人工智能·计算机视觉·数据挖掘·多模态
PyAIGCMaster5 小时前
ubuntu装P104驱动
linux·运维·ubuntu
zzzhpzhpzzz6 小时前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
o(╥﹏╥)6 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
橙子小哥的代码世界6 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉