深度相机标定

本文介绍了如何使用ROS进行深度相机标定,包括准备工作、编译、订阅摄像头信息和开始标定的步骤。通过下载特定尺寸的棋盘标定板,在5m×5m的无遮挡环境下进行标定,利用`rosrun`命令启动标定脚本,并根据实际的棋盘格大小调整参数。在标定过程中,需不断移动标定板,待CALIBRATE按钮变亮后点击进行标定,等待一两分钟完成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 准备工作

首先,请下载标定板。教程中使用的是8X6,边长为108mm的棋盘标定板。由于标定过程使用的是棋盘内部的角点进行,所以实际上我们使用的是9格X7格的棋盘标定板 。
请确保标定环境拥有一个5m×5m的无遮挡环境。

2 编译

运行以下指令

$ rosdep install camera_calibration

3 订阅摄像头信息

运行 roslaunch openni2_launch openni2.launch

使用

$ rostopic list

来查阅当前发布的topic信息,请确认topic的列表中存在

/camera/camera_info

/camera/image_raw

如果不存在,请检查你的摄像头驱动是否正确安装。

4 开始标定

rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.108

来运行标定结点的python脚本,其中 –size 8x6 为当前标定板的大小 –square 0.108为每个棋盘格的边长 根据标定板的不同,可以按照需求更改这两个参数 image:=/camera/rgb/image_raw标定当前订阅图像来源自名为/camera/rgb/image_raw的topic camera:=/camera为摄像机名出现。

接着不断移动标定板,直到CALIBRATE按钮变亮,点击该按钮就会进行标定。标定过程将持续一两分钟,并且标定界面会变成灰色,无法进行操作,耐心等待即可。并且,摄像机的各个参数会出现在标定程序的终端窗口中,如下:

### ROS中相机内参标定方法 在ROS环境中进行相机内参标定通常依赖于`camera_calibration`包,该工具能够处理符合标准ROS相机接口的各种相机驱动程序节点[^3]。为了启动这一过程并完成相机内部参数的校准,需遵循一系列特定的操作流程。 #### 安装必要的软件包 确保已安装用于解析相机校准文件的相关软件包: ```bash sudo apt install ros-<ros2-distro>-camera-calibration-parsers ``` 此命令会下载并配置所需的库来支持后续操作中的数据读取与写入功能[^2]。 #### 启动相机设备及其对应的ROS节点 对于不同类型的摄像头(如USB webcam, Kinect等),需要先运行相应的ROS节点以使能图像流传输至ROS网络中。例如OpenNI兼容的RGB-D传感器可以通过如下方式激活其服务: ```bash roslaunch openni_launch openni.launch ``` 这一步骤旨在建立从硬件到软件的数据桥梁,使得上层应用可以获取实时视频帧作为输入源[^1]。 #### 执行实际的标定过程 当一切准备就绪之后,则可调用专门设计好的GUI界面来进行交互式的棋盘格图案识别以及角点检测任务。通过终端执行下面这条指令即可打开图形化用户界面: ```bash rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera ``` 上述脚本里的参数可以根据实际情况调整;其中`--size`指定的是目标板尺寸而`--square`代表单个方格边长,在单位选择方面建议采用米制系统以便与其他物理量保持一致。随着不断移动带有特征模式的目标物直至覆盖整个视野范围内的多个视角位置,最终得到一组精确描述镜头畸变特性的系数矩阵以及其他几何属性信息[^4]。 ```python import cv2 as cv import numpy as np # 准备对象点,像(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) objp = np.zeros((6*7,3), np.float32) objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) # 储存所有的对象点和图片点来自所有图像 objpoints = [] # 3d point in real world space imgpoints = [] # 2d points in image plane. images = glob.glob('*.jpg') for fname in images: img = cv.imread(fname) gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 查找棋盘格角落 ret, corners = cv.findChessboardCorners(gray, (7,6), None) # 如果找到,添加对象点,图像点(细化后的) if ret == True: objpoints.append(objp) corners2 = cv.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria) imgpoints.append(corners2) # 绘制并显示拐角 cv.drawChessboardCorners(img, (7,6), corners2, ret) cv.imshow('img', img) cv.waitKey(500) cv.destroyAllWindows() ret, mtx, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值