【学习ARTookit】——摄像头与标识的关系

摄像机与标识的坐标系
这里写图片描述

1.在SimpleTest程序里

程序通过arGetTransMat获得标识物到摄像机坐标系的变换矩阵patt_trans

 // 获取标识在摄像机坐标系的位置
arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans);
    printf("%f %f %f\n",patt_trans[0][3],patt_trans[1][3],patt_trans[2][3]);

相当于以摄像机的位置为坐标系原点,来表示标识的位置,通过移动标识,坐标就会跟随着变化,坐标X,Y,Z轴的变化就反映了标识的移动。
①当将标识向左移动时,第一个值X轴的坐标就会增加。因为标识向左移动,相当于以摄像头为坐标系的X轴的正向移动;
②当将标识向上移动时,第二个值Y轴的坐标就会减小。因为标识向上移动,相当于以摄像头为坐标系的Y轴的负向移动;
③当将标识向前移动时,最后一个值Z轴的坐标就会减小。因为标识向前移动,相当于以摄像头为坐标系的Z轴的负向移动。

2.在exview程序里

arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans);

通过函数arUtilMatInv(patt_trans, cam_trans)即可获取摄像机在标志物坐标系的坐标为(cam_trans[0][3], cam_trans[1][3], cam_trans[2][3])。

相当于以标志物的位置为坐标系原点,来表示摄像机的位置。
①当将标识向左移动时,第一个值X轴的坐标就会减小。因为当标识向左移动时,相当于摄像头以标识为参照物向右移动(即向X轴负方向移动);
②当将标识向上移动时,第二个值Y轴的坐标就会减小。因为当标识向上移动时,相当于摄像头以标识为参照物向下移动(即向Y轴负方向移动);
③当将标识向前移动时,最后一个值Z轴的坐标就会减小。因为当标识向前移动时,相当于摄像头以标识为参照物向后移动(即向Z轴负方向移动)。

如图显示了摄像头位置在标识物体坐标系中的相对位置。(红色X轴,蓝色Z轴,绿色Y轴)
这里写图片描述

3.改变显示物体的位置

// 函数的参数分别表示沿X,Y,Z方向移动的数量
glTranslatef(200.0, 200.0, -100.0 );

这里写图片描述

如图所示,表示将物体以标识为坐标原点向X轴正方向移动200,向Y轴正方向移动200,向Z轴负方向移动100。即可完成显示物体的位置不在标识的中心。

4. 在relationTest程序里

if( object[0].visible >= 0
     && object[1].visible >= 0 ) {
        double  wmat1[3][4], wmat2[3][4];

        arUtilMatInv(object[0].trans, wmat1);
        arUtilMatMul(wmat1, object[1].trans, wmat2);

        for( j = 0; j < 3; j++ ) {
            for( i = 0; i < 4; i++ ) printf("%8.4f ", wmat2[j][i]);
            printf("\n");
        }
        printf("\n\n");

这段代码计算了两个标识之间的相对转移矩阵。object[0].trans是标识卡1在摄像机坐标系里面的转移矩阵,object[1].trans是标识卡2在摄像机坐标系里面的转移矩阵.因此object[0].trans的转置乘以object[1].trans就得到了标识卡2在标识卡1坐标系里面的转移矩阵。运行程序,把标识卡放在如图所示位置上:
这里写图片描述

这里写图片描述

输出的最后一列是标识卡2在标识卡1坐标系里面的相对转移矩阵。锥体在球体的左侧(X轴方向上-217mm处),在标识卡1 上(Y轴方向上8mm),它们几乎在同一平面上(Z轴方向上-110mm).移动标识卡1和标识卡2,观察输出值,理解它们之间的关系。

猜你喜欢

转载自blog.csdn.net/qq_37308779/article/details/79758679