首页IT科技摄像机标定的使用策略(摄像头标定–camera_calibration)

摄像机标定的使用策略(摄像头标定–camera_calibration)

时间2025-09-19 10:45:52分类IT科技浏览9050
导读:参考链接:camera_calibration - ROS Wiki...

参考链接:camera_calibration - ROS Wiki

为什么要标定

普通相机成像误差的主要来源有两部分                    ,第一是相机感光元件制造产生的误差                             ,比如成

像单元不是正方形                   、歪斜等;第二是镜头制造和安装产生的误差          ,镜头一般存在非线性的径

向畸变                    。

在对相机成像和三维空间中位置关系对应比较严格的场合(例如尺寸测量                              、视觉 SLAM

等)就需要准确的像素和物体尺寸换算参数               ,这参数必须通过实验与计算才能得到                             ,求解参

数的过程就称之为相机标定                             。

标定前准备

标定板

在执行摄像头标定前              ,需要先准备一块标定板          。

标定板有两种获得方法          ,第一种是采购成品的标定板                              ,A4纸大小的标定板通常价格在300~400的样子               。

如果不想采购                   ,可以使用打印机将下面的文件按照1:1打印在A4纸上     ,然后贴在一块纯平的版上                              ,例如亚克力板                             。

标定板PDF文件

打印的标定板缺点在于                        ,第一打印机的精度有限,边缘可能会产生模糊                         ,另外就是在粘贴时很难做到极高的平整度                             ,这两项都会对标定结果产生一定的影响     ,但是优点时便宜易得              。

摄像头调焦

标定只针对手动对焦的相机                    ,自动对焦的相机由于焦距变化                             ,难以形成固定的标定参数          。

相机在标定前          ,需要调整好焦距(拧镜头)               ,使成像清晰                             ,并将当前焦距固定住              ,防止焦距产生变化                              。

标定摄像头

标定需要用到camera_calibration功能包          ,可以通过apt方式安装                   。

sudo apt install ros-noetic-camera-calibration

安装完成后启动相机

roscore rosrun usb_cam usb_cam_node

然后启动标定节点                              ,启动这个节点传入的参数比较多                   ,拆分来看一下

--size 11x8用于指明标定板的内角点数量     ,如下图每个红圈的位置就是一个内角点                              ,我所使用的GP290标点板有横向有11个内角点                        ,纵向有8个内角点     。需要注意的时11x9中的‘x’时小写的英文字母‘x’,不是数学符号‘*’                              。

使用时根据你所使用标定板实际尺寸修稿

--square 0.02指明标定板中每个方块的边长0.02m                         ,即2cm                             ,根据你所使用标定板实际尺寸修稿

image:=/usb_cam/image_raw     ,指明图像话名                        。根据你实际使用的相机驱动节点产生的话题名做修改

rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.02 image:=/usb_cam/image_raw

标定启动后会出现这样的界面

拿着标定板放在相机视野内                    ,标定板上出现彩色线条则为有效图像                             ,反之无效          ,需要调整标定板位置。

分别在左右移动(X)               ,直到标定界面上X下方的精度条为绿色                             ,然后依次在上下(Y)              ,远近(Size)          ,倾斜(Skew)方向移动                              ,移动过程尽量缓慢                   ,避免大幅度的移动使相机成像产生拖影                         。持续移动直到所有的进度条都为绿色                             。

当所有进度条都变成绿色后     ,CALIBRATE按钮由灰色变成深绿色                              ,点击CALIBRATE                        ,点击一下后,界面会卡住                         ,此时不要做任何操作                             ,直到运行标定程序的终端输出标定的结果     ,大概是这样的     。

标点完成后再将标定板放在相机视野内                    ,右上角会出现标定结果的线性误差                             ,通常这个值小于0.1或者显示acc都可以认为标定结果可用

点击标定界面的SAVE按钮          ,标定结果保存在/tmp/calibrationdata.tar.gz这个压缩包中               ,打开标定结果的压缩包                             ,里面大概是这些内容              ,最后一个yaml文件就是我们需要的标定结果                    。

这里需要注意一下          ,/tmp目录中的文件随时可能会被系统删除                              ,所以最好将标定的结构拷贝到其他目录下                             。例如我将ost.yaml文件拷贝至用户主目录~中          。

使用标定结果

接下来由于需要编写launch文件                   ,建议你创建一个功能包用于存放文件     ,例如我使用了我自己编写的bingda_tutorials功能包               。在功能包中创建一个config目录                              ,将在标定中的获得的ost.yaml文件拷贝至config目录                             。

cd ~/catkin_ws/src/bingda_tutorials mkdir config cp ~/ost.yaml ./config/

在功能包的launch目录中创建launch文件                        ,例如命名为bingda_camera.launch

<launch> <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" > <param name="video_device" value="/dev/video0" /> <param name="image_width" value="640" /> <param name="image_height" value="480" /> <param name="pixel_format" value="yuyv" /> <param name="camera_frame_id" value="usb_cam" /> <param name="io_method" value="mmap"/> <param name="camera_name" value="my_camera"/> <param name="camera_info_url" type="string" value="file://$(find bingda_tutorials)/config/ost.yaml"/> </node> </launch>

在launch 文件中,将camera_name修改为my_camera                         ,camera_info_url指向标定文件存放的路径和位置中              。

然后将文件中的camera_name参数修改为和launch文件中的camera_name参数一致

image_width: 640 image_height: 480 camera_name: my_camera

现在通过编写luanch文件来启动摄像头

roslaunch bingda_tutorials bingda_camera.launch

使用echo将camera_info话题输出                             ,可以看到摄像头的标定参数已经加载在话题中了

rostopic echo /usb_cam/camera_info

矫正图像

如果需要使用标定参数矫正图像     ,可以使用image_proc这个功能包

首先通过apt方式安装 sudo apt install ros-noetic-image-proc

安装完成后运行它                    ,这里加入ROS_NAMESPACE是由于usb_cam这个功能包中发布的话题都带有了/usb_cam这个命名空间                             ,所以为了保证图像和摄像头参数话题能正常的被image_proc节点接收需要给它加上命名空间/usb_cam

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

运行后打开两个rqt_image_view          ,分别订阅原始的/usb_cam/image_raw和畸变矫正后的/usb_cam/image_rect_color图像话题               ,下图是我使用一个广角相机运行的结果                             ,可以看到畸变矫正效果很明显          。

如果你使用的是视场角比较小或者标称无畸变的相机              ,可能对比效果没有这么明显          ,但是标定过程和广角是一致的                              。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python 防火墙(怎么让python通过防火墙)