ROS相机标定
时间: 2025-03-28 11:12:00 浏览: 50
### ROS相机标定方法与教程
在ROS中进行相机标定是一个常见的任务,用于校正镜头畸变并获取相机的内部参数矩阵。以下是关于如何利用ROS中的`camera_calibration`包来实现这一目标的具体说明。
#### 使用`camera_calibration`包进行相机标定
为了执行单目相机标定,在Ubuntu 20.04上安装好ROS之后,可以按照以下方式操作:
1. **启动图像流节点**
需要先确保有一个发布图像话题的节点正在运行。如果使用的是USB摄像头,则可以通过`usb_cam`驱动程序启动它[^2]。
```bash
rosrun usb_cam usb_cam_node _video_device:=/dev/video0
```
2. **运行标定工具**
接下来,启动`camera_calibration`包内的交互式标定界面。此命令会打开一个窗口让用户展示棋盘格图案给摄像头看,并自动检测角点位置。
```bash
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.025 image:=/usb_cam/image_raw camera:=/usb_cam
```
上述命令假设使用的棋盘格有8列和6行交差点,每个方格边长为25毫米(即0.025米)。这些数值应根据实际打印出来的模板调整。
3. **移动棋盘格模式**
将带有黑白相间方块的标准棋盘放在不同角度、距离以及方向下让摄像机能捕捉到它的画面。尽量覆盖整个视野范围以便获得更精确的结果。
4. **保存标定数据**
当收集足够的样本后点击“CALIBRATE”按钮计算内参模型;成功后再按“SAVE”,这将会把所得的数据序列化成YAML文件形式存储起来供以后加载使用[^1]。
#### 示例代码片段
下面给出了一段简单的Python脚本来演示如何读取已有的相机配置文件并将它们应用于订阅来的图片消息之上做去畸变处理:
```python
import cv2
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
class UndistortImageNode(object):
def __init__(self):
self.bridge = CvBridge()
# Load calibration parameters from YAML file.
fs = cv2.FileStorage('calibration.yaml', cv2.FILE_STORAGE_READ)
if not fs.isOpened():
raise Exception("Failed to open calibration file.")
mtx = fs.getNode('camera_matrix').mat() # Camera intrinsic matrix
dist = fs.getNode('distortion_coefficients').mat() # Distortion coefficients
sub_image = rospy.Subscriber("/input_topic", Image, self.callback)
def callback(self, msg_in):
try:
img_cv = self.bridge.imgmsg_to_cv2(msg_in, desired_encoding="passthrough")
except CvBridgeError as e:
print(e)
return
h,w = img_cv.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
dst = cv2.undistort(img_cv,mtx,dist,None,newcameramtx)
x,y,w,h = roi
dst = dst[y:y+h,x:x+w]
if __name__ == '__main__':
node_name='undistort_image'
rospy.init_node(node_name)
undistortor=UndistortImageNode()
rospy.spin()
```
上述代码展示了如何从先前保存下来的`.yaml`格式文档里提取必要的信息来进行反向映射变换消除透镜弯曲效应的影响。
---
阅读全文
相关推荐


















