基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位

说明:以下涉及到的一些公式以及图片来自于Learning OpenCV。

做了快2个月的立体相机标定,遇到了一些问题,也有了一些体会,在这里记下来。

1.在做立体相机标定的时候,标定板的规范与否直接影响到最后标定的结果,进而会影响目标3D坐标重建。

这里说的规范指的是,打印的棋盘格(或者圆点)需要保证每个square都是严格大小一致的,即打印出来后每个棋盘格大小应一样;打印出来的棋盘格要尽量平整的附在某一平面或者玻璃板上,然后才能用来拍摄标定图像;测量squareSize的时候,要尽可能的精确,也就是说,棋盘格的实际物理尺寸对标定结果影响很大。

对左右相机出来图像要有深刻的理解,左图的目标处于相对偏右的位置,左右相机出来的图像千万不要弄反了,建议选取10对以上的图像对做标定。

2.立体相机标定的一些概念

2.1.相机投影

像素平面上的点q(x,y)与世界中的点Q(X,Y,Z)的变换对应关系为:

x = fx(X/Z)+cx,y = fy(Y/Z) + cy;

写成矩阵的形式:

2.2.透镜畸变

理论上面可能定义一种透镜而不引入任何畸变,但是在实际制造中会引入透镜畸变。径向畸变来自于透镜的形状,切向畸变则来自于整个摄像机的组装过程。 其他形式的畸变基本可以忽略,在OpenCV标定的过程中,也只针对这两种畸变做处理。

径向畸变示意图如上,其畸变矫正建模如下:

x_corrected = x(1+k1*r2+k2*r^4+k3*r^6);

y_corrected = y(1+k1*r2+k2*r^4+k3*r^6).

(x,y)为畸变点在成像仪上的原始位置,(x_corrected,y_corrected)为矫正后的新位置,标定中,k1,k2,k3为畸变内参。

切向畸变示意图如上,其畸变矫正建模如下所示:

x_corrected = x + [2*p1*y+p2*(r^2+2x^2)]

y_corrected = y + [p1*(r^2+2*y^2)+2*p2*x]

标定中,p1,p2为畸变内参。

2.3.立体成像stereo imaging

通过上面的三角关系,利用简单的相似三角形知识,就可以得到

T-(xl-xr) : (Z-f) = T : Z ==> Z = f*T/(xl - xr)

f为焦距,T为baseline,(xl - xr)为视差,可知求取深度信息只与这三个值有关。

深度与视差成反比例关系,当视差接近0时,微小的视差变化会导致很大的深度变化,当视差较大时,微小的视差变化几乎不会引起很大的深度变化。

通过相机标定,我们最终要将摄像机在数学上对准到同一个观察平面上,从而使得摄像机之间的像素行是严格平行的。

2.4.对极几何

立体成像的基本几何就是对极几何,运用对极几何的最终目的是为了尽可能的缩小两台立体摄像机上匹配点出现的可能范围。

说明几点:

1.摄像机视图内的每个3D点都包含在极面内,极面与每幅图像相交的直线是极线,

2.指定一个图像上面的特征,它在另一幅图像上的匹配视图一定在对应的极线上,这就是“对极约束”,

3.有了对极约束之后,意味着对二幅图像间特征匹配的二维搜索转变成了沿着极线的一维搜索,这不仅节约了时间,还可排除大量的虚假匹配,

4.不同特征的次序时保留的,如果A,B在两成像仪中都可见,按顺序水平出现,那么在另一成像仪上也是水平出现。

2.5.本征矩阵E与基础矩阵F

本征矩阵E是单几何意义上的,与成像仪无关,它将左摄像机观测到的点P的物理坐标与右摄像机观测到的相同位置的点关联起来。

基础矩阵F则是将一台摄像机的像平面上的点的像素坐标和另一台摄像机像平面上的点关联起来。

2.6.重投影矩阵

给定屏幕坐标以及内参矩阵,二维点同样可以重投影到三维世界中,

三维坐标就是(X / W , Y / W , Z / W).

3.立体标定stereo calibration

具体参照OpenCV自带的stereo_calib demo;

在对标定板进行拍摄时,目标棋盘要尽可能清晰,设备分辨率越高对检测棋盘格角度越精确,棋盘格要以不同姿态摆放,且棋盘格的运动范围要覆盖所有图像区域,这样才能够保证标定的参数结果是针对几乎所有位置的像素进行标定得到的。

3.1.输入立体图像对文件:stereo_images.xml

<?xml version="1.0"?>

<opencv_storage>

<imagelist>

"left01.bmp" "left02.bmp" ...

</imagelist>

</opencv_storage>

注意:"left01.bmp" "left02.bmp" 两个文件名中间要有空格

3.2.输入squareSize:实际的棋盘格大小mm

测量要精确,毕竟网上卖的玻璃棋盘板都是号称准确度为0.001mm。

3.3输出文件:intrinsic.yml, extrinsic.yml

4.参数解释

intrinsic params内参

M1,M2--内参矩阵

[fx  0  cx;

M = 0  fy   cy;

0  0   1]

D1,D2--畸变向量

D =

k为径向畸变,p为切向畸变.

extrinsic params外参

R--右相机相对左相机的旋转矩阵

T--右相机相对左相机的平移矩阵

R1,R2--左右相机校准变换(旋转)矩阵

P1,P2--左右相机在校准后坐标系中的投影矩阵

Q--视差-深度映射矩阵,我利用它来计算单个目标点的三维坐标

5.三维坐标计算

step1. 立体相机标定,获取相机系统内外参数

step2. 获取目标点在左右成像平面上的像素坐标

step3. 利用标定参数对像素坐标进行校准undistortPoints

step4. 利用重投影矩阵计算目标三维坐标

时间: 2024-12-21 10:38:09

基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位的相关文章

基于OpenCV单目相机的快速标定--源码、工程、实现过程

相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友网站Github上下载工程源码(https://github.com/Zhanggx0102/Camera_Calibration),注意以下几点: 1).这是一个MS Visual Studio 2010的工程源码(版本是201x都可以). 2).在编译运行之前请先在VS中配置好OpenCV(网上

基于opencv的摄像头的标定

四个坐标系分别为:世界坐标系(Ow),摄像机坐标系(Oc),图像物理坐标系(O1,单位mm),图像像素坐标系(O,位于视野平面的左上角,单位pix). 空间某点P到其像点p的坐标转换过程主要是通过这四套坐标系的三次转换实现的,首先将世界坐标系进行平移和转换得到摄像机坐标系,然后根据三角几何变换得到图像物理坐标系,最后根据像素和公制单位的比率得到图像像素坐标系.(实际的应用过程是这个的逆过程,即由像素长度获知实际的长度) OpenCV中使用的求解焦距和成像原点的算法是基于张正友的方法( pdf )

张正友相机标定Opencv实现以及标定流程&amp;&amp;标定结果评价&amp;&amp;图像矫正流程解析(附标定程序和棋盘图)

使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上). 相机标定的输出:摄像机的内参.外参系数. 这三个基础的问题就决定了使用Openc

双目相机标定以及立体测距原理及OpenCV实现

作者:dcrmg 单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy是相机单个感光单元芯片的长度和宽度,是一个物理尺寸,有时候会有dx=dy,这时候感光单元是一个正方形.Cx和Cy分别代表相机感光芯片的中心点在x和y方向上可能存在的偏移,因为芯片在安装到相机模组上的时候,由于制造精度和组装工艺的影响,很难做到中心完全重合.f代表相机的焦距. 双目标定的第一步需要分别获取左右相机的内外参

基于opencv的相机标定

双目相机标定以及立体测距原理及OpenCV实现 作者:dcrmg 单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy是相机单个感光单元芯片的长度和宽度,是一个物理尺寸,有时候会有dx=dy,这时候感光单元是一个正方形.Cx和Cy分别代表相机感光芯片的中心点在x和y方向上可能存在的偏移,因为芯片在安装到相机模组上的时候,由于制造精度和组装工艺的影响,很难做到中心完全重合.f代表相机的焦距

基于OpenCV立体视觉标定和校正

这几天学习双目视觉标定,分别使用了两种工具:OpenCV和Matlab.Matlab的效果非常稳定,但是一开始OpenCV的效果很糟糕,要不是出现中断就是标定出来的结果数值很大.经过了几天的不断调试和更改,终于把OpenCV的立体视觉标定和校正的程序写出来了.立体标定时计算空间上的两台摄像机几何关系的过程,立体校正则是对个体图像进行纠正,保证这些图像可以从平面对准的两幅图像获得.程序的框架如下: 1.读取左右相机图片序列 双目相机的图片序列放在Demon的路径下,左右相机的图像的名字分别存放在两

OpenCV实现张正友相机标定源代码

本源代码基于VC++和opencv Opencv2.4.13.6版本开发,实现张正友相机标定源代码,资源包括完整源代码和12张棋盘图片,完美运行.Opencv2.4.13.6安装包下载地址:http://www.211xun.com/download_page_1261_cn.html 点击下载 原文地址:https://www.cnblogs.com/211xun/p/10499995.html

相机标定 matlab opencv ROS三种方法标定步骤(1)

一 .理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表示各个坐标系下的转换 首先在图像坐标系下与相机坐标系的关系 可得出   Xcam=x/dx+x0,    Ycam=y/dy+y0  表示为矩阵形式 Xcam           1/dx   0      x0          x Ycam      =    0     1/dy   y0    *  

OpenCV相机标定

相机标定 相机标定:简单的说,就是获得相机参数的过程.参数如:相机内参数矩阵,投影矩阵,旋转矩阵和平移矩阵等 什么叫相机参数? 简单的说,将现实世界中的人.物,拍成一张图像(二维).人或物在世界中的三维坐标,和图像上对应的二维坐标间的关系.表达两种不同维度坐标间的关系用啥表示?用相机参数. 相机的成像原理 先来看一下,相机的成像原理: 如图所示,这是一个相机模型.将物体简化看成一个点.来自物体的光,通过镜头,击中图像平面(图像传感器),以此成像.d0是物体到镜头的距离,di时镜头到图像平面的距离