相机单独标定的实现过程[autoware标定]tmp文件的查看方式
Posted FYY2LHH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相机单独标定的实现过程[autoware标定]tmp文件的查看方式相关的知识,希望对你有一定的参考价值。
安装了autoware1.13和calibration标定包,发现实现相机单独标定的过程较为坎坷,参考了一些博主的方法,发现下面的过程更加适合自己,做个笔记。
1安装标定箱(与calibration标定包的安装并不冲突)
标定工具箱安装教程参考:(复制下面命令百度下载即可)
https://github.com/XidianLemon/calibration_camera_lidar
把工程克隆到自己本地工程的src目录下编译即可。我本人的本地工程文件夹为catkin_ws
【注】我的ubuntu是18.04版本的,对应的ROS版本为melodic,直接编译会有一些小问题。
(1)此时直接运行标定程序,会报找不到可执行文件 calibration_camera_lidar的问题。因为我的系统是ubuntu18.04对应支持的ROS是melodic,因此需要对calibration_camera_lidar功能包下的CMakeLists.txt进行修改,添加ROS的melodic版本的支持,如下图所示,修改CMakeLists.txt中所有 (indigo|jade|kinetic) 为 (indigo|jade|kinetic|melodic)
此时直接运行标定程序,会报找不到可执行文件 calibration_camera_lidar的问题。因为我的系统是ubuntu18.04对应支持的ROS是melodic,因此需要对calibration_camera_lidar功能包下的CMakeLists.txt进行修改,添加ROS的melodic版本的支持,如下图所示,修改CMakeLists.txt中所有 (indigo|jade|kinetic ) 为 (indigo|jade|kinetic|melodic)
2编译
上述过程提到的编译,我直接在catkin_ws文件夹下开启终端输入下列命令
catkin_make
编译一次性通过
3相机标定
相机标定(单目--ROS方法)【下面应该是官方的命令】
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
这个命令是参考博主的,这里py后的命令里的数据应该是可以修改的,修改成自己所做标定板格子面积的数据。
这是我自己的命令【12×9个格子,只有11×8个角点,边长为44mm】
rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.044 image:=/usb_cam/image_raw camera:=/usb_cam
打开另一个新的终端,创建相机参数文件
下面,我们来创建一个包含相机校准参数的相机参数文件(camera.yaml)。如下例所示,解压缩calibrationdata.tar.gz文件以查看图像文件(*.png)和记录了校准中使用的校准参数的ost.txt文件。
cd /tmp
tar -xvzf calibrationdata.tar.gz
接下来,将ost.txt文件改名为ost.ini,并使用camera_calibration_parsers功能包
的convert节点创建相机参数文件(camera.yaml)。创建完成后,将其保存在~/.ros/camera_info/目录中,则ROS中使用的相机相关功能包会引用此信息。
mv ost.txt ost.ini
rosrun camera_calibration_parsers convert ost.ini camera.yaml
mkdir ~/.ros/camera_info
mv camera.yaml ~/.ros/camera_info/
接下来,将ost.txt文件改名为ost.ini,并使用camera_calibration_parsers功能包
的convert节点创建相机参数文件(camera.yaml)。创建完成后,将其保存在~/.ros/camera_info/目录中,则ROS中使用的相机相关功能包会引用此信息。
mv ost.txt ost.ini
rosrun camera_calibration_parsers convert ost.ini camera.yaml
mkdir ~/.ros/camera_info
mv camera.yaml ~/.ros/camera_info/
细节部分参考ROS摄像头标定_w²大大的博客-CSDN博客
这里存在一个问题,save保存之后我没有找到我的文件在哪里,其实他应该是存储在临时文件夹tmp中,这里我在主目录下新建了一个文件夹名为qaw
cp -r /tmp/* /home/ros/qaw
然后我用上面的命令将临时文件夹中的所有文件都复制到了这个qaw文件夹中,新文件夹的路径为
/home/ros/qaw(如果不知道文件夹的全称,可以用进入该文件夹终端pwd命令查看)
相机参数解释
参考文献
autoware 激光-相机联合标定_autoware联合标定_nuo112的博客-CSDN博客
基于OpenCV单目相机的快速标定--源码工程实现过程
相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享。
1.单目相机标定的工程源码
首先请到同性交友网站Github上下载工程源码(https://github.com/Zhanggx0102/Camera_Calibration),注意以下几点:
1).这是一个MS Visual Studio 2010的工程源码(版本是201x都可以)。
2).在编译运行之前请先在VS中配置好OpenCV(网上搜索有很多图文并茂的教程),OpenCV的各个版本应该都兼容,我使用的是2.4.6。
3).这个工程源码不是个人编写,而是我直接从OpenCV中拷贝出来的。
完成上述配置之后你会发现项目中的源文件有以下几项:
camera_calibration.cpp----相机标定的源码
in_Arlco_Camera_data.xml----某款相机的标定参数配置文件
Arlco_Camera.xml----某款相机的标定用图片索引文件
in_Logitech_C170.xml----另一款相机的标定参数配置文件
Logitech_C170.xml----另一款相机的标定用图片索引文件
此时如果点击运行则标定的是Arlco相机,且标定使用的是预先拍好的图片。
2.相机标定的配置过程。
经过第一部分的介绍,下面你要做的就是更改配置来标定你自己的相机(注意:这个时候你已经打印了一张自己的标定黑白棋盘),请紧跟下列步骤:
1).在工程目录中找到文件in_Arlco_Camera_data.xml,复制一份改个名字如:in_YourCam_Camera_data.xml 放置在同样的文件夹下,表示这是你自己的相机标定配置文件。
2).修改camera_calibration.cpp源代码中的217行
const string inputSettingsFile = argc > 1 ? argv[1] : "in_Arlco_Camera_data.xml";
改为你刚才复制的自己的配置文件,例如:
const string inputSettingsFile = argc > 1 ? argv[1] : "in_YourCam_Camera_data.xml";
3).修改你自己的相机标定配置文件in_YourCam_Camera_data.xml,具体如下:
<!-- Number of inner corners per a item row and column. (square, circle) -->
<BoardSize_Width>7</BoardSize_Width>
<BoardSize_Height>5</BoardSize_Height>
这一步配置你的横向和纵向角点(黑白相交的点)数,如下图所示。我的是横向7个,纵向5个,请根据自己的标定棋盘更改相应的数目。
1 <!-- The size of a square in some user defined metric system (pixel, millimeter)--> 2 <Square_Size>30</Square_Size>
这个定义的是你的棋盘格的尺寸,我的是30mm,请根据自己的做更改。
<!-- The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID --> <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>
这个定义的是你标定用的棋盘类型,如果你用的是黑白棋盘,不用修改。
<Input>"Arlco_Camera.xml"</Input> <!-- If true (non-zero) we flip the input images around the horizontal axis.--> <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>
这个指定的是你标定的时候采用的方式,支持一下三种:
a. 用预先拍好的带有标定棋盘的照片进行标定。(本文采用的标定方式,下面将具体介绍方法)
b.用预先录制好的视频进行标定(支持AVI格式)。用"/tmp/x.avi"代替源码中的"Arlco_Camera.xml"即可,其中x.avi是你录制好的带有棋盘的视频。
c.打开相机边录制边标定。用“1”代替源码中的"Arlco_Camera.xml"即可。
如果采用a方法,需要工程目录中找到文件Arlco_Camera.xml,复制一份改个名字如:YourCam_Camera.xml 放置在同样的文件夹下。这个里面指定了标定用的照片的存放位置和名称,具体代码如下:
<?xml version="1.0"?>
<opencv_storage>
<images>
imges/1.jpg
imges/2.jpg
imges/3.jpg
imges/4.jpg
imges/5.jpg
imges/6.jpg
imges/7.jpg
imges/8.jpg
imges/9.jpg
imges/10.jpg
imges/11.jpg
imges/12.jpg
imges/13.jpg
imges/14.jpg
imges/15.jpg
imges/16.jpg
imges/17.jpg
imges/18.jpg
imges/19.jpg
imges/20.jpg
imges/21.jpg
imges/22.jpg
imges/23.jpg
imges/24.jpg
imges/25.jpg
imges/26.jpg
imges/27.jpg
</images>
</opencv_storage>
你不需要修改,只需要把工程目录下的imges文件夹里的图片换成你自己的就可以了,图片名称还是用1~27的数字。
继续回到in_YourCam_Camera_data.xml文件修改参数:
<!-- How many frames to use, for calibration. --> <Calibrate_NrOfFrameToUse>27</Calibrate_NrOfFrameToUse>
这里27指定了你预先拍照的数量,可以修改,但是需要相应的修改YourCam_Camera.xml文件。
<!-- The name of the output log file. --> <Write_outputFileName>"out_Arlco_Camera_data.yml"</Write_outputFileName>
这里指定的是你的标定参数保存的文件名称,用自己的名字如:out_YourCam_Camera_data.yml 代替:out_Arlco_Camera_data.yml 即可。
ok,其余的参数用默认即可,这个时候请把你修改好的文件:in_YourCam_Camera_data.xml 和 YourCam_Camera.xml 添加到工程项目的源码中。
此时点击运行口可以标定你自己的相机了,最后的结果会保存在工程目录下,名字就是上一步你自己设置的out_YourCam_Camera_data.yml。
标定过程如下图所示:
完成后你就可以看到相机内参、外参以及畸变系数了,部分数据如下:
%YAML:1.0 calibration_Time: "09/02/17 14:27:10" nrOfFrames: 27 image_Width: 1280 image_Height: 720 board_Width: 7 board_Height: 5 square_Size: 30. FixAspectRatio: 1. # flags: +fix_aspectRatio +fix_principal_point +zero_tangent_dist flagValue: 14 Camera_Matrix: !!opencv-matrix rows: 3 cols: 3 dt: d data: [ 1.0078520005023535e+003, 0., 6.3950000000000000e+002, 0., 1.0078520005023535e+003, 3.5950000000000000e+002, 0., 0., 1. ] Distortion_Coefficients: !!opencv-matrix rows: 5 cols: 1 dt: d data: [ -4.9694653328469340e-002, 2.3886698343464000e-001, 0., 0., -2.1783942538569392e-001 ] Avg_Reprojection_Error: 6.4271522441441153e-001 Per_View_Reprojection_Errors: !!opencv-matrix rows: 27 cols: 1 dt: f data: [ 3.89407665e-001, 4.69866753e-001, 3.74819994e-001, 4.79580641e-001, 2.85050988e-001, 3.93756509e-001, 9.21430171e-001, 7.79153645e-001, 6.87648296e-001, 6.19106829e-001, 6.83992207e-001, 6.41160131e-001, 2.52024829e-001, 2.94729859e-001, 4.55538809e-001, 7.44070828e-001, 4.21751559e-001, 5.13929784e-001, 6.03685081e-001, 1.09411442e+000, 1.20731401e+000, 8.70341241e-001, 3.22936684e-001, 4.73881990e-001, 8.06841075e-001, 6.78049505e-001 ]
我用的图片是1280x720的,这个数据是根据你用的标定图片得出的。
3.总结
本文是为视觉入门者准备的,后续我会陆续介绍在linux下的标定过程,包括用其他开源库如ArUco等的标定方法。
作者:Shawn
以上是关于相机单独标定的实现过程[autoware标定]tmp文件的查看方式的主要内容,如果未能解决你的问题,请参考以下文章