我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>培训教程

ARTool摄像头与目标相对位置计算原理浅析

文章来源:第三维度 作者: 发布时间:2013年07月30日 点击数: 字号:

    来源:第三维度
    作者:未知

    前言

    好久没有把学习的东西写出来了,最近在研究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维的道理相同。

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料