【相机内参标定实战】—— 从棋盘格到配置文件:手把手完成张正友标定
1. 为什么需要相机标定第一次接触计算机视觉项目时我拿着USB相机拍了几张照片就直接开始做目标检测结果发现检测框总是对不齐物体。后来才知道就像人眼戴了度数不合适的眼镜会看不清东西一样未经标定的相机拍出来的图像也存在畸变。相机内参标定就是给相机配一副合适的眼镜的过程。张正友标定法之所以成为行业标准是因为它只需要一张棋盘格就能完成标定。我做过对比实验用未标定的相机测量物体间距误差能达到5%以上而标定后的测量误差可以控制在0.5%以内。对于需要精确测量的场景如工业检测、SLAM建图这个步骤绝对不能跳过。2. 准备工作硬件与软件配置2.1 棋盘格打印注意事项很多新手会忽略棋盘格的打印质量。我曾在普通A4纸上打印棋盘格结果发现纸张弯曲会导致角点检测误差反光面会干扰图像识别打印机缩放可能改变实际尺寸最佳实践是使用相纸或卡纸打印将棋盘格贴在平整的硬纸板上用游标卡尺测量至少5个方格的边长取平均值确保棋盘格边长误差小于0.1mm2.2 开发环境搭建ROS环境配置是个容易踩坑的环节。最近帮学员调试时发现不同版本的ROS对USB相机的支持差异很大。推荐以下稳定组合# Ubuntu 18.04 ROS Melodic sudo apt-get install ros-melodic-usb-cam sudo apt-get install ros-melodic-camera-calibration如果遇到设备权限问题可以尝试# 将当前用户加入video组 sudo usermod -a -G video $USER # 查看设备节点 ls -l /dev/video*3. 标定实操全流程3.1 启动相机节点常见的一个误区是直接使用默认启动参数。实际上分辨率设置不当会导致标定失败。建议先查询相机支持的分辨率v4l2-ctl --list-formats-ext然后在launch文件中指定分辨率param namevideo_width value1280/ param namevideo_height value720/3.2 标定程序参数详解很多人照搬教程里的--size 8x6参数其实这个值应该是棋盘格内角点数量。比如9x7的棋盘格内角点就是8x6。我建议在启动标定程序前先用OpenCV检测import cv2 img cv2.imread(chessboard.jpg) ret, corners cv2.findChessboardCorners(img, (8,6)) print(角点检测结果:, ret)3.3 数据采集技巧新手常犯的错误是只在一个位置拍摄。根据我的经验最佳采集策略是覆盖整个视野左上、中上、右上等9宫格位置多种倾斜角度前后倾斜30°-45°不同距离从最近对焦距离到2米外每张图像应有至少50%的棋盘格可见当标定程序界面的X/Y/Size/Skew进度条都变绿时说明数据已足够。这时候点击CALIBRATE按钮等待约30秒计算完成。4. 标定结果分析与应用4.1 解读标定文件标定生成的yaml文件中这几个参数最关键camera_matrix: rows: 3 cols: 3 data: [fx, 0, cx, 0, fy, cy, 0, 0, 1] distortion_coefficients: rows: 1 cols: 5 data: [k1, k2, p1, p2, k3]其中fx/fy焦距像素值两者差值体现像素非正方形程度cx/cy光学中心坐标理想情况应在图像中心k1-k3径向畸变系数p1-p2切向畸变系数4.2 验证标定效果我常用的验证方法是拍摄另一组棋盘格图像用OpenCV计算重投影误差mean_error cv2.projectPoints(...)[1] print(平均重投影误差:, mean_error)误差小于0.5像素说明标定质量良好1-2像素可接受超过2像素建议重新标定。5. 常见问题排查5.1 标定程序无响应可能原因相机话题名称不匹配用rostopic list确认图像话题棋盘格尺寸单位错误确保使用米制单位OpenCV版本冲突ROS自带OpenCV可能与系统版本冲突5.2 畸变矫正效果异常如果矫正后的图像出现严重扭曲通常是棋盘格移动太快导致运动模糊环境光线过暗/过亮标定板未被完整检测建议在标定时打开可视化窗口实时观察rosrun image_view image_view image:/image_rect6. 进阶技巧与优化6.1 多分辨率标定法对于变焦镜头我推荐在不同焦距下分别标定建立内参-焦距查找表。具体步骤固定5-7个典型焦距位置在每个焦距下完成标定将结果存储为字典结构6.2 自动标定脚本对于需要频繁标定的场景可以编写自动化脚本import subprocess subprocess.run([rosrun, camera_calibration, ...]) while not check_calibration(): adjust_pose() save_results()这个脚本的关键是实现check_calibration()函数通过图像分析判断当前采集质量。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2554381.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!