ROS 摄像头标定 camera calibration

本文转自:白巧克力亦唯心 https://blog.youkuaiyun.com/heyijia0327/article/details/43538695 

上一个ROS教程视觉文章中,我们使用usb_cam包读入并发布了图像消息,但是图像没有被标定,因此存在畸变。ROS官方提供了用于单目或者双目标定的camera_calibration包。这个包是使用opencv里的张正友标定法,所以如果你有使用opencv标定的经验,可以直接标定,而不使用官方的程序。

        官方也给出了单目的标定教程双目视觉的标定教程。本教程基于usb_cam  package 读取图像,然后使用官方例程进行标定。

1.使用usb_cam 读取图像,launch文件如下:

[plain] view plain copy
  1. <launch>  
  2.     <arg name="device" default="/dev/video0" />  
  3.     <node name="usb_cam_node" pkg="usb_cam" type="usb_cam_node" output="screen">  
  4.         <param name="video_device" value="$(arg device)" />  
  5.         <param name="image_width" value="640" />  
  6.         <param name="image_height" value="480" />  
  7.         <param name="framerate" value="30" />  
  8.         <param name="brightness" value="128" />  
  9.         <param name="contrast" value="128" />  
  10.         <param name="saturation " value="70" />  
  11.     </node>  
  12. </launch>  

2.检查usb_cam package发布的消息:

[plain] view plain copy
  1. $ rostopic list  
看是否有如下消息,并记住名称
  • /usb_cam_node/camera_info
    /usb_cam_node/image_raw
3.启动标定程序:

[plain] view plain copy
  1. $ rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.03 image:=/usb_cam_node/image_raw camera:=/usb_cam_node  

其中参数size 11x8 注意是字母x,他是棋盘内部角点个数,如下图所示。square为棋盘正方形边长,注意刚刚开始标定的时候,CALIBRATE按钮是灰色的。

                         

4.标定程序使用方法:

       为了得到一个好的标定结果,应该使得标定板尽量出现在摄像头视野的各个位置里:

       如标定板出现在视野中的左边,右边,上边和下边,标定板既有倾斜的,也有水平的,。

       界面中的x:表示标定板在视野中的左右位置。

                     y:表示标定板在视野中的上下位置。

                size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近。

                skew:标定板在视野中的倾斜位置。

还要有棋盘占住大部分视野的图片,如下图所示:

       按着上述方式不断移动标定板,直到CALIBRATE按钮变亮,点击该按钮就会进行标定。标定过程将持续一两分钟,并且标定界面会变成灰色,无法进行操作,耐心等待即可。

       标定完成以后,你将看到如下图所示的窗口,窗口中的图像为标定后的结果,纠正了畸变

                           

        并且,摄像机的各个参数会出现在标定程序的终端窗口中,如下:

                        

如果对标定结果满意,点击COMMIT按钮将结果保存到默认文件夹,在usb_cam窗口中可以看到如下信息,说明标定结果已经保存在相应文件夹下下次启动usb_cam节点时,会自动调用。



<think>好的,用户想查找关于ROS摄像头标定的方法或教程,包括示例代码。我需要结合提供的引用信息来整理回答。首先,引用[2]提到在Ubuntu 20.04上使用ROS的相机标定包进行标定,获取内部参数和畸变系数。引用[1]涉及图像订阅的回调函数,可能和实际处理流程相关。引用[4]提到了OpenCV的双目标定,但用户可能需要ROS特定的方法,比如使用camera_calibration包。此外,引用[3]是Autolabor的初级教程,可能提供ROS基础,但具体标定步骤还是需要更详细的信息。 首先,我应该介绍ROS中的标准摄像头标定方法,即使用camera_calibration包。需要详细步骤,比如安装包、准备棋盘格、运行节点、调整参数等。然后,示例代码部分应该展示如何订阅图像消息,并在回调函数中处理图像,可能涉及发布校准后的图像或保存参数。需要确保代码部分符合ROS的Python写法,并且正确使用话题名称。 还要注意用户可能需要单目和双目标定的区别。引用[4]是双目,但用户的问题可能更关注单目,所以需要分情况说明。同时,标定后的应用,比如在机器人视觉中的使用,可以引用[2]提到的提高测量精度的重要性。 最后,相关问题部分需要生成与标定相关的扩展问题,比如标定结果的使用、常见问题、与其他工具对比、标定板选择等。需要确保问题覆盖用户可能感兴趣的方面,帮助他们进一步学习。</think>关于ROS摄像头标定的方法和教程,以下是结合官方文档和参考资料的详细说明: ### ROS摄像头标定方法 1. **安装标定工具包** ```bash sudo apt-get install ros-$ROS_DISTRO-camera-calibration ``` 该工具包提供棋盘格标定界面,支持单目/双目摄像头[^2]。 2. **启动摄像头驱动节点** ```bash roslaunch usb_cam usb_cam-test.launch ``` 确保图像话题名称为`/usb_cam/image_raw` 3. **启动标定程序** ```bash rosrun camera_calibration cameracalibrator.py \ --size 8x6 \ # 棋盘格角点数 --square 0.024 \ # 方格边长(米) image:=/usb_cam/image_raw ``` 4. **标定过程** - 移动棋盘格至不同位置和角度,直至所有进度条变为绿色 - 点击`CALIBRATE`开始计算参数 - 保存结果到`/tmp/calibrationdata.tar.gz` ### 示例代码框架 ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge def image_callback(msg): bridge = CvBridge() cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") # 此处可添加图像处理代码 if __name__ == '__main__': rospy.init_node('camera_calibration_node') image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, image_callback) rospy.spin() ``` 该代码实现了基本的图像订阅功能,实际标定建议直接使用官方工具[^1][^2] ### 标定结果应用 标定完成后,在启动摄像头节点时加载参数: ```bash roslaunch usb_cam usb_cam-test.launch camera_info_url:=file://${HOME}/.ros/camera_info/camera.yaml ``` 通过加载标定文件,系统会自动校正图像畸变[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值