目录
- 1 理想双目视觉系统
- 2 立体校正
- 3 实例
1 理想双目视觉系统
文章图片
图1
如图1所示为理想双目视觉系统:两像机成像面共面行对齐,极点处于无限远处——像点 ( x 0 , y 0 ) \left( x_0,y_0 \right) (x0?,y0?)对应的极线为 y = y 0 y=y_0 y=y0?。
关于极点、极线方面的内容可以参考之前的博客:计算机视觉系列教程1-4:对极几何基本原理图解
取定左相机坐标系为标准系,由相似关系,物点在左成像面的坐标为
[ L ????? x L ???????? y ] = [ f X Z f Y Z ] \left[ \begin{array}{c} ^L\!\!\:x\\ ^L\!\!\:\!\:y\\\end{array} \right] =\left[ \begin{array}{c} f\frac{X}{Z}\\ f\frac{Y}{Z}\\\end{array} \right] [LxLy?]=[fZX?fZY??]
设双目系统的间距为 b x b_x bx?,则双目系统相机位姿关系为
L R T = [ 1 ? b x 1 0 1 0 1 ] _{L}^{R}\boldsymbol{T}=\left[ \begin{matrix} 1& & & -b_x\\ & 1& & 0\\ & & 1& 0\\ & & & 1\\\end{matrix} \right] LR?T=?????1?1?1??bx?001??????
因此物点在右相机坐标系下为 R ????? X = L R T ?? ? L ?????????? X = [ X ? b x Y Z ] T ^R\!\!\:\boldsymbol{X}=_{L}^{R}\boldsymbol{T}\!\:^L\!\!\:\!\!\:\boldsymbol{X}=\left[ \begin{matrix} X-b_x& Y& Z\\\end{matrix} \right] ^T RX=LR?TLX=[X?bx??Y?Z?]T,同样由相似原理得
[ R ????? x R ???????? y ] = [ f X ? b x Z f Y Z ] \left[ \begin{array}{c} ^R\!\!\:x\\ ^R\!\!\:\!\:y\\\end{array} \right] =\left[ \begin{array}{c} f\frac{X-b_x}{Z}\\ f\frac{Y}{Z}\\\end{array} \right] [RxRy?]=[fZX?bx??fZY??]
由于行对齐,因此同一物点在两成像面上形成立体视差
d = L ????? x ? R ????? x = f b x Z d=^L\!\!\:x-^R\!\!\:x=f\frac{b_x}{Z} d=Lx?Rx=fZbx??
所谓立体视差就是同一个物点在两个相机成像面上相点之差。
从而可以从成像面坐标还原三维坐标,并转换为像素尺度:
[ X Y Z ] = [ L ????? x b x d L ????? y b x d f b x d ] = [ ( L ????? u ? L ????? c u ) b x d u ( L ????? v ? L ????? c v ) b x d u f u b x d u ] \left[ \begin{array}{c} X\\ Y\\ Z\\\end{array} \right] =\left[ \begin{array}{c} ^L\!\!\:x\frac{b_x}{d}\\ ^L\!\!\:y\frac{b_x}{d}\\ f\frac{b_x}{d}\\\end{array} \right] =\left[ \begin{array}{c} \left( ^L\!\!\:u-^L\!\!\:c_u \right) \frac{b_x}{d_u}\\ \left( ^L\!\!\:v-^L\!\!\:c_v \right) \frac{b_x}{d_u}\\ f_u\frac{b_x}{d_u}\\\end{array} \right] ???XYZ????=???Lxdbx??Lydbx??fdbx??????=????(Lu?Lcu?)du?bx??(Lv?Lcv?)du?bx??fu?du?bx???????
其中 Z Z Z即为图像深度信息。将上述方程改写为线性形式:
[ X Y Z 1 ] = [ 1 0 0 ? L ????? c u 0 1 0 ? L ????? c v 0 0 0 f u 0 0 1 b x R ????? c u ? L ????? c u b x ] [ L ????? u L ????? v d u 1 ] ? L ?? X = Q L ????? u \left[ \begin{array}{c} X\\ Y\\ Z\\ 1\\\end{array} \right] =\left[ \begin{matrix} 1& 0& 0& -^L\!\!\:c_u\\ 0& 1& 0& -^L\!\!\:c_v\\ 0& 0& 0& f_u\\ 0& 0& \frac{1}{b_x}& \frac{^R\!\!\:c_u-^L\!\!\:c_u}{b_x}\\\end{matrix} \right] \left[ \begin{array}{c} ^L\!\!\:u\\ ^L\!\!\:v\\ d_u\\ 1\\\end{array} \right] \Leftrightarrow { ^L\!\boldsymbol{X}=\boldsymbol{Q}^L\!\!\:\boldsymbol{u}} ?????XYZ1??????=?????1000?0100?000bx?1???Lcu??Lcv?fu?bx?Rcu??Lcu?????????????LuLvdu?1???????LX=QLu
其中 Q Q Q称为重投影矩阵, R ????? c u ? L ????? c u b x \frac{^R\!\!\:c_u-^L\!\!\:c_u}{b_x} bx?Rcu??Lcu??表征了两成像平面中心的像素偏差。
2 立体校正 实际应用时并不能直接使用上面的模型,因为没有任何硬件可以真正达到理想双目系统的条件,如图2所示。
文章图片
图2 实际双目系统
将实际双目系统变换为理想双目系统的过程称为立体校正,下面详细阐述Bouguet立体校正算法,其核心原理是通过像素平面透视变换,使左右图像重投影误差最小,使双目系统最接近理想状态。
定义左右两相机间的变换关系为
L R T = [ R t 0 1 ] _{\boldsymbol{L}}^{\boldsymbol{R}}\boldsymbol{T}=\left[ \begin{matrix} \boldsymbol{R}& \boldsymbol{t}\\ 0& 1\\\end{matrix} \right] LR?T=[R0?t1?]
通过旋转矩阵 R R R先将右相机坐标系旋转到与左相机坐标系平行,如图3所示。
文章图片
图3
此时双目系统平行但不共面,需要构造一个校准矩阵 R r e c t R_{rect} Rrect?将两相机坐标系旋转到同一成像面上,实现共面行对齐校正,如图4所示。
文章图片
图4 两相机坐标系共同旋转至共面行对齐
设 R r e c t = [ r 1 T r 2 T r 3 T ] T \boldsymbol{R}_{rect}=\left[ \begin{matrix} \boldsymbol{r}_{1}^{T}& \boldsymbol{r}_{2}^{T}& \boldsymbol{r}_{3}^{T}\\\end{matrix} \right] ^T Rrect?=[r1T??r2T??r3T??]T,其构造过程如下:
①r 1 r_1 r1?是旋转后坐标系的 x ′ x' x′相对于原坐标系三个轴的
方向余弦
,为保证旋转后两成像面共面,需要将原坐标系 x x x轴旋转至基线 ? t -t ?t方向,即r 1 = ? t ∥ t ∥ \boldsymbol{r}_1=\frac{-\boldsymbol{t}}{\left\| \boldsymbol{t} \right\|} r1?=∥t∥?t?
②r 2 r_2 r2?、 r 3 r_3 r3?事实上可以任意给出,只需满足
右手系
方向即可。一般地,取{ r 2 = ? t × [ 0 0 1 ] T ∥ ? t × [ 0 0 1 ] T ∥ r 3 = r 1 × r 2 \begin{cases} \boldsymbol{r}_2=\frac{-\boldsymbol{t}\times \left[ \begin{matrix} 0& 0& 1\\\end{matrix} \right] ^T}{\left\| -\boldsymbol{t}\times \left[ \begin{matrix} 0& 0& 1\\\end{matrix} \right] ^T \right\|}\\ \boldsymbol{r}_3=\boldsymbol{r}_1\times \boldsymbol{r}_2\\\end{cases} ????r2?=∥∥??t×[0?0?1?]T∥∥??t×[0?0?1?]T?r3?=r1?×r2??
使 y ′ y' y′垂直于原光轴方向。
综合上述步骤得到
{ R L = R r e c t R R = R r e c t R T \begin{cases} \boldsymbol{R}_L=\boldsymbol{R}_{rect}\\ \boldsymbol{R}_R=\boldsymbol{R}_{rect}\boldsymbol{R}^T\\\end{cases} {RL?=Rrect?RR?=Rrect?RT?
接下来进行像素平面的映射。在不考虑畸变的条件下,相机坐标系未旋转时有 u = K x \boldsymbol{u}=\boldsymbol{Kx} u=Kx,旋转后则为 u ′ = K x ′ = K R x \boldsymbol{u}'=\boldsymbol{Kx}'=\boldsymbol{KRx} u′=Kx′=KRx,因此旋转前后像素坐标的关系为
u ′ = K R K ? 1 u = H u { \boldsymbol{u}'=\boldsymbol{KRK}^{-1}\boldsymbol{u}=\boldsymbol{Hu}} u′=KRK?1u=Hu
像素立体校正后,即可使用理想双目系统模型进行场景几何的估计。
总结Bouguet立体校正算法流程:
(1) 基于相机几何信息 R R R、 t t t 构造 R L R_L RL?、 R R R_R RR?;
(2) 基于旋转前后像素坐标关系得到单应性矩阵 H L = K R L K ? 1 \boldsymbol{H}_L=\boldsymbol{KR}_L\boldsymbol{K}^{-1} HL?=KRL?K?1、 H R = K R R K ? 1 \boldsymbol{H}_R=\boldsymbol{KR}_R\boldsymbol{K}^{-1} HR?=KRR?K?1;
(3) 归一化齐次坐标。映射后 u ′ = [ u v w ] \boldsymbol{u}'=\left[ \begin{matrix} u& v& w\\\end{matrix} \right] u′=[u?v?w?],需归一化为 u ′ = [ u / w v / w 1 ] \boldsymbol{u}'=\left[ \begin{matrix} u/w& v/w& 1\\\end{matrix} \right] u′=[u/w?v/w?1?]。
关于单应性矩阵方面的知识可以参考计算机视觉系列教程1-2:单应性矩阵估计
3 实例
计算机视觉基础教程说明
章号内容【计算机视觉教程|计算机视觉教程6-1(图解双目视觉系统与立体校正原理)】 更多精彩专栏:
0色彩空间与数字成像
1计算机几何基础
2图像增强、滤波、金字塔
3图像特征提取
4图像特征描述
5图像特征匹配
6立体视觉
7项目实战
- 《ROS从入门到精通》
- 《机器人原理与技术》
- 《机器学习强基计划》
- 《计算机视觉教程》
- …
源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系
推荐阅读
- 双目校正|双目立体校正C/C++复现
- python|手把手教你使用Python获取B站视频并在本地实现弹幕播放功能
- 微软|突发!马斯克 440 亿拿下Twitter!
- 陈大好(持续创造小而美的产品丨独立开发者 x 开放麦)
- 编程语言|想接私活时薪再翻一倍,建议根据这几个开源的SpringBoot项目(含小程序)改改~...
- 机器学习|机器学习之EM算法的原理及推导(三硬币模型)及Python实现
- 中间件|Dubbo 3.0 前瞻系列(服务发现支持百万集群,带来可伸缩微服务架构)
- C语言与C++编程|大厂已经不收一本以下学历的程序员了......
- 百度|这是真的「狠」啊