多摄像机标定和去畸变
Table of Contents
1、kalibr多摄像机标定
1.1 系统安装,环境配置:实测Ubuntu 16.04
1.2 多摄像机标定
2、OpenCV双目标定
3、Matlab多摄像机标定
4、利用标定矩阵去畸变
进行摄像机标定的目的:求出相机的内、外参数,以及畸变参数。
标定相机后通常是想做两件事:一个是由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变矫正畸变,生成矫正后的图像;另一个是根据获得的图像重构三维场景。
摄像机标定过程,简单的可以简单的描述为通过标定板,如下图,可以得到n个对应的世界坐标三维点Xi和对应的图像坐标二维点xi,这些三维点到二维点的转换都可以通过上面提到的相机内参K,相机外参R和t,以及畸变参数D,经过一系列的矩阵变换得到。
1、kalibr多摄像机标定
kalibr提供两种标定方法,标定板标定和IMU联合标定。IMU联合标定又分了两种,都需要移动摄像机测其加速度和角速度,这里只讨论第一种方法。
kalibr支持小孔摄像机模型 pinhole camera model 代号(pinhole),全景(鱼眼)摄像机模型 omnidirectional camera model代号 (omni),double sphere camera model (ds) 和extended unified camera model (eucm),
畸变模型支持四种:
(1) radial-tangential模型代号 (radtan) 畸变参数 (distortion_coeffs: [k1 k2 r1 r2])
(2)equidistant模型代号 (equi)畸变参数(distortion_coeffs: [k1 k2 k3 k4])
(3) fov模型代号 (fov)畸变参数(distortion_coeffs: [w])
(4)none (none)无畸变
1.1 系统安装,环境配置:实测Ubuntu 16.04
github地址https://github.com/ethz-asl/kalibr/wiki/installation
按此教程安装原作者只tested on Ubuntu 14.04 with ROS indigo,在Ubuntu 16.04上测试各种坑:
(1)首先ROS版本不对,Wily (Ubuntu 15.10), Xenial (Ubuntu 16.04) and Jessie (Debian 8)需要用Kinetic版,indigo only for Ubuntu 14.04,解决方法 apt-cache search ros-kinetic 再install
(2)实际上还是第一个问题,在step1中:sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-indigo-vision-opencv ros-indigo-image-transport-plugins ros-indigo-cmake-modules python-software-properties software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev
其中的indigo换成kinetic,然后第一步搞定。这里ROS是一个机器人操作系统。
(3)每次编译完记得source ~/kalibr_workspace/devel/setup.bash不然can not find kalibr...这不是很大的问题,按照教程编译即可顺利完成。
1.2 多摄像机标定
github地址https://github.com/ethz-asl/kalibr/wiki/multiple-camera-calibration
按此教程测试成功,然而:在使用google上测试集解压时kalibr_bagextractor命令报错
(1)需要将所有import cv去掉改成import cv2,如有import cv2可以不加,可以在kalibr_workspace中grep一下。
(2)/kalibr_workspace/src/Kalibr/aslam_offline_calibration/kalibr/python下kalibr_bagextractor.py中CV_IMWRITE_PNG_COMPRESSION这玩意现在OpenCV中改名了改成IMWRITE_PNG_COMPRESSION,错误解决。
一个标定的例子:
标定需要输入的文件:包含图形的bag文件和标定板参数文件。
1 bag 文件
<1>. bag 文件内容:
这是在连续时间获得的拍摄标定版的图像,需要自己采集后再利用kalibr提供的工具去转化成.bag包。
.bag文件的具体内容是:标定需要的图像数据。格式是:
+-- dataset-dir
+--cam0
│ +-- 1385030208726607500.png
│ +-- ...
│ \-- 1385030212176607500.png
+--cam1
│ +-- 1385030208726607500.png
│ +-- ...
│ \-- 1385030212176607500.png
文件格式是:19位时间戳(精确到ns)
+.png
<2>bag的制作工具:
kalibr_bagcreater--folder dataset-dir --output-bag awsome.bag
dataset-dir是数据输入路径:
其内文件结构应是这样:
/cam0/image_raw
/cam1/image_raw
awsome.bag 是制作好的bag文件。输出默认在kalibr_bagcreater同目录下。
2 标定板参数文件:target.yam
Kalibr支持三种标定板,分别是Aprilgrid、Checkerboard和Circlegrid。
参数比较简单:见https://github.com/ethz-asl/kalibr/wiki/calibration-targets
运行标定
在制作完成标定需要文件后,就可以对cam进行标定了。
比如:你的标定板文件是checkerboard_7x6_50x50cm.yaml,图集文件是test.bag,执行
kalibr_calibrate_cameras --target checkerboard_7x6_50x50cm.yaml --bag test.bag --models pinhole-radtan pinhole-radtan --topics /cam0/image_raw /cam1/image_raw --show-extraction
你会得到几个输出文件。
report-cam-%BAGNAME%.pdf: Report in PDF format. Contains all plots for documentation.
results-cam-%BAGNAME%.txt: Result summary as a text file.
标定后信息的结果文件。我们想要的T变换矩阵就在这里。
标定结果会有几个配置文件和十几张图,包含需要的内参、外参矩阵,畸变矩阵和采集的角点数据等图表,四相机标定第一张如下:
最新版输出文件做了一些调整, 更加简洁明了
配置文件各项含义:
distortion:畸变矩阵
projection:相机内参矩阵和误差
reprojection error: 重投影误差
baseline T_1_0:相机相对cam0的变换矩阵和误差
Calibration results
====================
Camera-system parameters:
cam0 (/cam0/image_raw):
type: <class 'aslam_cv.libaslam_cv_python.DistortedPinholeCameraGeometry'>
distortion: [ 0.06568449 -0.08392869 -0.00315785 0.00106943] +- [ 0.0160049 0.02663301 0.00116534 0.00317792]
projection: [ 442.02259928 443.14770648 316.98899348 243.35970071] +- [ 1.63469684 1.49185652 0.12309439 0.47567269]
reprojection error: [0.000018, 0.000014] +- [0.137302, 0.150509]
cam1 (/cam1/image_raw):
type: <class 'aslam_cv.libaslam_cv_python.DistortedPinholeCameraGeometry'>
distortion: [ 0.07265888 -0.08776908 -0.00139381 -0.00063354] +- [ 0.01025724 0.01719563 0.00148038 0.00233125]
projection: [ 445.03430272 446.56599862 326.28265384 243.38158539] +- [ 1.35112571 0.95830375 0.44508838 1.98046013]
reprojection error: [-0.000023, -0.000059] +- [0.130851, 0.146344]
baseline T_1_0:
q: [-0.02371515 0.75701358 0.22090299 0.61446716] +- [ 0.00464091 0.00505561 0.0023115 ]
t: [ 1.44796512 -0.60946268 1.73243158] +- [ 0.0075708 0.00719059 0.00840142]
Target configuration
====================
Type: checkerboard
Rows
Count: 7
Distance: 0.05 [m]
Cols
Count: 6
Distance: 0.05 [m]
2、OpenCV多摄像机标定
OpenCV 2016开始增加了双目标定,误差比较大,而且需要先单摄像机标定后再用stereoCalibrate函数双目标定。
https://docs.opencv.org/master/d4/d94/tutorial_camera_calibration.html
3、Matlab多摄像机标定
Matlab多摄像机标定工具AMCC toolbox. MIT 棋盘格自动标定工具,需要翻墙: https://bitbucket.org/michaeldwarren/amcctoolbox/wiki/Home
4、利用标定矩阵去畸变
利用得到的相机内参和畸变矩阵,输入原图像可以得到对应相机去畸变的图像,OpenCV有三个相关函数,参数略有不同。
(1) fisheye::undistortImage(image, dst,intrinsic_matrix,distortion_coeffs,new_intrinsic_mat);
(2)cvUndistort2(src, dst,intrinsic_matrix,distortion_coeffs); (3)initUndistortRectifyMap()+remap()
其中initUndistortRectifyMap和cvUndistort2原理相同,主要是先存了下仿射变换在内存,再remap下,适合同相机的大量图像去畸变处理,fisheye::undistortImage主要适用鱼眼相机模型。
去畸变前后图像栗子如下:
多摄像机标定和去畸变相关推荐
- 摄像机标定以及镜头畸变
摄像机标定其本质就是计算摄像机的内参和外参.关于标定板上的世界坐标对应到图像像素坐标的过程这里就不做推导,网上太多博客都有详细推导过程.本篇主要说明摄像机标定原理里的几个要点: 1. 外参矩阵所含旋转 ...
- 从普通相机模型到鱼眼畸变模型--标定与去畸变
目录 普通相机模型 普通成像模型 针孔模型与透镜组: 径向畸变 切向畸变 现代手机摄像头的基本组成 内参矩阵 畸变模型 张氏标定法 鱼眼模型 透镜组 r和f的进一步说明 等距投影模型(OpenCV:: ...
- 机器视觉——单目相机模型(坐标标定以及去畸变)
单目相机模型: 针孔相机模型的映射关系: 化为矩阵形式: 其中,中间的矩阵被称为相机的内参矩阵K.通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化.有点相机生产厂商会告诉你相机的内参, ...
- 畸变的单目摄像机标定
畸变的单目摄像机标定 Deep Single Image Camera Calibration with Radial Distortion 摘要 单图像标定是从一幅图像中预测摄像机参数的问题.在处理 ...
- python 正方形去畸变_opencv 角点检测+相机标定+去畸变+重投影误差计算
https://blog.csdn.net/u010128736/article/details/52875137 https://blog.csdn.net/h532600610/article/d ...
- 【计算机视觉】摄像机标定与畸变校正
任务1:利用OpenCV实现摄像机参数标定 设置好棋盘格参数(边长.行列数等),打印方形棋盘格并粘贴,拍摄多张标定图像: 估计标定参数,可视化标定结果. 任务2:根据标定参数进行畸变校正 ...
- 读取摄像机的内参和畸变系数并对畸变图像进行去畸变
这个程序的目标是读取摄像机的参数(内参和畸变系数),并对畸变图像进行去畸变操作,然后进行一些特征点和矩形框的绘制. #include 语句引入所需的库. using namespace std; 和 ...
- 【OpenCV】摄像机标定+畸变校正
摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.opencv ...
- 【笔记】摄像机标定和3D重构
目录 一.摄像机标定 1.设置 2.标定 3.畸变矫正 4.反向投影差 三.对极几何 四.深度地图 一.摄像机标定 单孔摄像机(照相机)会给图像带来很多畸变,畸变主要有 "径向畸变" ...
最新文章
- redis 自减命令_Redis 实战 —— 04. Redis 数据结构常用命令简介
- java定时器返回future_java 定时器线程池(ScheduledThreadPoolExecutor)的实现
- 这枚纸币为什么这么贵?
- 社区团购的终局是不是团长被抛弃?
- 时间是把杀猪刀...分享我10年的水深火热:软件测试员!
- linux命令--ldconfig和ldd用法
- 为DPDK eal动态库添加新函数 ld不过的问题
- Spring面试问题和答案
- java upnp 端口映射_端口映射与UPnP
- 电脑开机显示无法自动修复计算机,电脑开机提示自动修复怎么办?
- 牛逼的 弹出层 layer !!!
- 项目管理网络图概念总结
- 全国高中数学联赛——组合
- 太飒了!这届乘风破浪的 IT 女神写得了代码、撕得掉年龄、跨得过行业!
- 安卓app开发方案_简谈企业最常用的三种安卓app开发语言
- 处理 __iob_func 无法链接的问题
- AFM成像表面形貌和表面粗糙度
- iOS 此时无法下载应用程序
- Simulink:车辆换挡逻辑回顾_Demo
- 免费的编程中文书籍索引
热门文章
- matlab 画偏振态,光的偏振态分析MATLAB分析
- 8行python代码展示程序员从入门到大神(或跑路)的全部状态
- 如何处理RuntimeError: _cdist_backward requires X1(X2) to be contiguous
- 华硕 N551 GPT分区安装win7 ghost+原版
- 京东凡客模式遭质疑 电子商务或回归本质
- 2022-2028年中国罕见病药物行业投资策略探讨及市场规模预测报告
- vue 上传图片 base64图片无法显示的问题
- Codeforce题解:Shurikens
- 【第一阶段:java基础】第7章:面向对象编程中级-2(P307-P318):多态
- A律13折现编解码实现,SystemVerilog实现,实测可用带完整的testbench