ARTool摄像头与目标相对位置计算原理浅析
来源:第三维度
作者:未知
前言
好久没有把学习的东西写出来了,最近在研究AR(增强现实)。发现ARToolKit的利用卡片的投影,来判断单摄像头来空间位置的思路很有特点,所以研究了一下。因为国内的资料很少,因此把从日文资料中学习来的内容分享给大家。
希望对在这方面有兴趣的朋友有所启发和帮助。
说明
1,本人正在学习过计算机视觉,还没有入门,有些术语用错的请指教。
2,原理部分涉及到线性代数的知识,本人已经忘光,虽然重新翻阅了同济大 学的线性代数教材,也只是应用其皮毛,此部分理论知识不牢。
一, ARToolkit介绍
对拙文感兴趣的朋友,一定多少了解该技术,我就不班门弄斧了。想了解的朋友随便检索一下会有很多介绍的相关文章。
我仅把官网备忘如下:http://www.hitl.washington.edu/artoolkit/
二, 摄像头相对位置算法思路(arGetTransMat)
ARToolkit的核心算法,我个人认为有2个,一个是卡片的识别(研究有心得的时候分享给大家),另外一个就是根据卡片投影的形状,来计算摄像头与卡片的相对位置。下面把该算法的实现原理介绍如下:
1,卡片的形状
正如大家所知道的,卡片的形状一定要是正方形(其他形状也可以,需要修改部分算法),正方型的好处是让算法相对简单。
2,卡片的图形
图形可以是任意的,单一定不能是中心对称的,因为中心对称的话就没有办法分辨出上下。
3,近小远大及投影关系
计算机视觉中,近小远大的投影关系,大家一定知道。ARTool就是巧妙的利用近小远大及投影关系来计算卡片相对摄像机远近,以及旋转(X轴/Y轴/Z轴)的相对位置。再具体点儿,
假设事先拍摄好的一张卡片的正上方图片为A(一定要是垂直的正上方),
在任意角度通过摄像头拍摄取得的卡片图像为B。
A为正视图,正方型是没有任何扭曲的。B则不同,B会相对与A在空间的X/Y/Z轴上有旋转,及有前后的位移。
如果我们能根据A与B的图像关系,分别计算出在X轴/Y轴/Z轴的旋转角度和的前后位移值,就知道了,摄像头相对于卡片的空间位置。问题就解决了。
简单吧,理解上面的1,2,3特别是3,的话,我们就可以往下进行具体实现了。
三, 用线性代数来实现
解决上面3的问题。
假设从摄像头上取得的卡片的坐标为Xc,Yc,Zc(摄像头坐标系),卡片的坐标为Xm,Ym,Zm。则有下面公式
|Xc| |r1 r2 r3| |Xm|
|Yc|=|r4 r5 r6||Ym|
|Xc| |r7 r8 r9| |Zm|
再假设相对与X轴的旋转角度为φ,相对与Y轴的旋转角度为θ,相对与Z轴旋转角度为ψ。
上面的行列式求解为
|cosφ –sinφ 0|
X=|sinφ conφ 0|
|0 0 1|
|1 0 0 |
Y= |0 cosθ –sinθ|
|0 sinθ cosθ|
|cosψ -sinψ 0|
Z= |sinψ cosψ 0|
|0 0 1|
R=
|cosφcosψ-sinφcosθsinψ-cosφsinψ-sinφcosθcosψ sinφsinθ|
|sinφcosψ+cosφcosθsinψ -sinφsinψ+cosφcosθcosψ-cosφsinθ|
|sinθsinψ sinθcosψ cosθ |
r9 = cosθ
r7^2+r8^2 = (sinθ)^2
如果sinθ≠0 则
cosφ = -r6/sinθ
sinφ = r3/sinθ
cosψ = r8/sinθ
sinψ = r7/sinθ
前后的前后位移非常简单,
|Xc| |x| |Xm|
|Yc| = |y| |Ym|
|Zc| |z| |Zm|
OK,问题解决完了。各位看懂了吗?
如果没有懂,也别灰心,刚学到这里的时候,我也不懂,直到我重新复习了线性代数。
四,线性代数复习
如果您同我一样,看到上面的公式不知所云的时候,请在网上搜索一下线性代数的教材,再回忆一下大学生活。(我看的是同济大学的线性代数教材,觉得讲的深入浅出。推荐给各位)
矩阵和线性变换之间存在的一一对应关系。以2维空间为例。
假设有向量OP(x,y),OP长度为r,辐角为θ,则x=rcosθ,y=rsinθ。
再假设OP1(x1,y1),OP1长度为与OP相同为r,辐角为在θ基础上旋转φ,则有
X1=rcos(θ+φ)=r(cosφcosθ-sinφsinθ)
Y1=rsin(θ+φ)=r(sinφcosθ+cosφsinθ)
把cosθ=x/r ,sinθ=y/r代入
X1=r(cosφx/r - sinφy/r)=xcosφ-ysinφ
Y1=r(sinφx/r + cosφy/r)=xsinφ+ ycosφ
写成行列式的形式的话
|cosφ -sinφ|
|sinφ cosφ|
看到这里懂了吧,虽然是2维的例子,与3维的道理相同。