引言:
摄像头标定是为了确保视觉系统能够准确反映现实世界中的对象,并消除图像中的畸变效果。在本实验中,我们使用了ROS中的功能包进行摄像头标定。标定的原理包括畸变校正和摄像头参数估计。通过移动标定板并捕获不同角度和距离的图像,我们可以获取摄像头的内参和外参。这些参数将使得图像处理和三维构建更加准确和可靠。通过本实验,我们将深入了解标定的流程,并熟悉使用ROS功能包进行标定的方法。这将为我们提供可靠的摄像头数据,为后续的机器人视觉任务奠定基础。
希望你在本次学习过后,能够有一定的收获!!!
推荐歌曲—不在联系-程响
冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶
在进行相关的实验之前,让我们先来了解一下相关的内容!!!
为什么要进行标定
标定的原理
视摄像头标定的原理主要涉及两大部分:畸变校正和摄像头参数估计。
畸变校正: 摄像头镜头畸变主要分为径向畸变和切向畸变。
畸变参数的估算通过标定过程进行,使用这些参数,可以准确地校正图像,消除畸变效果。
摄像头参数估计: 主要分为内参和外参。
标定过程
ROS典型的视摄像头标定过程使用棋盘格标定板,捕获不同角度和距离的棋盘格图像,利用这些图像计算摄像头的内外参数。通过这一过程,可以完成摄像头的标定,进而用于准确地图像处理和三维构建。
综上所述,摄像头标定是确保视觉系统在实际应用中发挥出良好性能的基础。正确的标定过程可以显著提升机器人视觉任务的准确度和可靠性。
接下来然我们进行相应的实验内容。
- 一个摄像头–啥摄像头都可以,只要对应的电脑能够读取(我这边采用海康威视)
- 一台可以开启并且正常运行的电脑
- 一个标定板 (我这边就拿手机放标定板图片作为标定目标)
如为对应的实验器材图片
海康威视摄像头

标定板图片

- ROS版本 —> Melodic Morenia
- ubuntu版本—> 18.04 LTS
在ROS中安装camera_calibration功能包是非常简单的。可以通过以下步骤来安装camera_calibration功能包:
sudo apt-get update
sudo apt-get install ros-melodic-camera-calibration
系统将提示您输入密码以进行安装。输入密码并按下Enter键。
系统将自动下载并安装camera_calibration功能包以及其相关依赖项。请耐心等待安装完成。
安装完成后,就可以在ROS中使用camera_calibration功能包进行相机标定实验。
并且我们也可以阅相关文档或实验报告,按照给定的指导进行后续操作和使用camera_calibration功能包进行相机标定。
就比如安装完后,我们可以进行摄像头的测试,检测摄像头是否正确连接、对应的功能包是否安装正确
启动ROS
roscore
启动摄像头驱动节点:
roslaunch usb_cam usb_cam-test.launch

查看话题
rostopic list #列出 topic 确保相机正在通过ROS发布图像
———————输出—————————
/image_view/output
/image_view/parameter_descriptions
/image_view/parameter_updates
/rosout
/rosout_agg
/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates
启动摄像头驱动节点:
rosrun usb_cam usb_cam_node
roslaunch usb_cam usb_cam-test.launch
查看图像话题是否发布:
rostopic list #列出 topic 确保相机正在通过ROS发布图像

rosrun camera_calibration cameracalibrator.py --size 7x9 --square 0.1 image:=/usb_cam/image_raw camera:=/head_camera --no-service-check
此命令运行标定结点的python脚本,其中 :
(1)–size 7x9 为棋盘内部角点的个数,方格几列几行(需要减1),比如我的标定板方格是8X10,则siez为7x9。
(2)–square 0.1为每个棋盘格的边长
(3)image:=/usb_cam/image_raw 为当前订阅的图像来自名为/usb_cam/image_raw的topic
(4)camera:=/head_camera为摄像机名(我试过写camera:=/camera也可以,目前还不知道是什么原因…)
(5)加上–no-service-check是因为一开始运行后出现下面的错误,参考官网加上此参数后就可正常显示:
('Waiting for service', '/camera/set_camera_info', '...')
Service not found
这将打开标定窗口,如下图所示:

为了达到良好的标定效果,需要在摄像机周围移动标定板,并完成以下基本需求:
(1)移动标定板到画面的最左、右,最上、下方。
(2)移动标定板到视野的最近和最远处。
(3)移动标定板使其充满整个画面。
(4)保持标定板倾斜状态并使其移动到画面的最左、右,最上、下方 。
当标定板移动到画面的最左、右方时,此时,窗口的x会达到最小或满值。同理,y指示标定板的在画面的上下位置,size表示标定板在视野中的距离,也可以理解为标定板离摄像头的远近。skew为标定板在视野中的倾斜位置。每次移动之后,请保持标定板不动直到窗口出现高亮提示。
直到条形变为绿色。当calibration按钮亮起时,代表已经有足够的数据进行摄像头的标定,此时请按下calibration并等待一分钟左右,标定界面会变成灰色,无法进行操作,属于正常情况。


如下为对应的字段解析
保存查看结果
点击SAVE按钮。
如果对标定结果满意,点击COMMIT按钮将结果保存到默认文件夹
并且我们可以将它修改为对应的yaml文件,便于以后使用

通过本次实验,我对ROS视摄像头标定的过程有了更深刻的理解和实践经验。以下是我的一些心得和总结:
最后感谢大佬友情链接: