在3d注册步骤中对artoolkit的arGetTransMatSub()函数有些怀疑

时间:2012-12-13 10:12:13

标签: 3d registration artoolkit dimensional

我正在学习artoolkit代码,但遇到了一些困难,它花了我两个多星期,特别是在三维注册部分,我真的不知道arGetTransMatSub()这个函数,特别是算法里面和变量。我已经阅读了一些关于artoolkit三维注册的文档,但我不能把这些理论和代码结合起来,以下是我的一些问题:
1. ArParamIdeal2Observ()的功能是将理想屏幕坐标系中的标记坐标转换为观察到的屏幕坐标系吗?
2.在for循环块中,wx,wy,wz表示摄像机坐标系中标记的坐标?
3. mat_b,mat_c,mat_d,mat_e分别表示什么?
我真的很想掌握这些,我很感谢你的帮助。

以下是arGetTransMatSub()函数的一些代码。

if( arFittingMode == AR_FITTING_TO_INPUT ) 
{
    for( i = 0; i < num; i++ ) 
    {
        arParamIdeal2Observ(dist_factor, ppos2d[i][0], ppos2d[i][1],
                                         &pos2d[i][0], &pos2d[i][1]);
    }
}
else
{
    for( i = 0; i < num; i++ ) 
    {
        pos2d[i][0] = ppos2d[i][0];
        pos2d[i][1] = ppos2d[i][1];
    }
}

for( j = 0; j < num; j++ ) 
{
    wx = rot[0][0] * pos3d[j][0]
       + rot[0][1] * pos3d[j][1]
       + rot[0][2] * pos3d[j][2];
    wy = rot[1][0] * pos3d[j][0]
       + rot[1][1] * pos3d[j][1]
       + rot[1][2] * pos3d[j][2];
    wz = rot[2][0] * pos3d[j][0]
       + rot[2][1] * pos3d[j][1]
       + rot[2][2] * pos3d[j][2];
    mat_a->m[j*6+0] = mat_b->m[num*0+j*2] = cpara[0][0];
    mat_a->m[j*6+1] = mat_b->m[num*2+j*2] = cpara[0][1];
    mat_a->m[j*6+2] = mat_b->m[num*4+j*2] = cpara[0][2] - pos2d[j][0];
    mat_c->m[j*2+0] = wz * pos2d[j][0]
           - cpara[0][0]*wx - cpara[0][1]*wy - cpara[0][2]*wz;
    mat_a->m[j*6+3] = mat_b->m[num*0+j*2+1] = 0.0;
    mat_a->m[j*6+4] = mat_b->m[num*2+j*2+1] = cpara[1][1];
    mat_a->m[j*6+5] = mat_b->m[num*4+j*2+1] = cpara[1][2] - pos2d[j][1];
    mat_c->m[j*2+1] = wz * pos2d[j][1]
          - cpara[1][1]*wy - cpara[1][2]*wz;
}
arMatrixMul( mat_d, mat_b, mat_a );
arMatrixMul( mat_e, mat_b, mat_c );
arMatrixSelfInv( mat_d );
arMatrixMul( mat_f, mat_d, mat_e );
trans[0] = mat_f->m[0];
trans[1] = mat_f->m[1];
trans[2] = mat_f->m[2];

ret = arModifyMatrix( rot, trans, cpara, pos3d, pos2d, num );

0 个答案:

没有答案