图像坐标求解三维坐标标准模板

void Cseed::unproject(const int index0, const int index1,

                      const Cpoint& p0, const Cpoint& p1,

                      Vec4f& coord) const{

  Mat4 A;

  A[0][0] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][0][0] -

    p0.m_icoord[0] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][0];

  A[0][1] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][0][1] -

    p0.m_icoord[0] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][1];

  A[0][2] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][0][2] -

    p0.m_icoord[0] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][2];

  A[1][0] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][1][0] -

    p0.m_icoord[1] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][0];

  A[1][1] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][1][1] -

    p0.m_icoord[1] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][1];

  A[1][2] =

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][1][2] -

    p0.m_icoord[1] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][2];

  A[2][0] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][0][0] -

    p1.m_icoord[0] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][0];

  A[2][1] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][0][1] -

    p1.m_icoord[0] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][1];

  A[2][2] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][0][2] -

    p1.m_icoord[0] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][2];

  A[3][0] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][1][0] -

    p1.m_icoord[1] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][0];

  A[3][1] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][1][1] -

    p1.m_icoord[1] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][1];

  A[3][2] =

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][1][2] -

    p1.m_icoord[1] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][2];

 

  Vec4 b;

  b[0] =

    p0.m_icoord[0] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][3] -

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][0][3];

  b[1] =

    p0.m_icoord[1] * m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][2][3] -

    m_fm.m_pss.m_photos[index0].m_projection[m_fm.m_level][1][3];

  b[2] =

    p1.m_icoord[0] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][3] -

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][0][3];

  b[3] =

    p1.m_icoord[1] * m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][2][3] -

    m_fm.m_pss.m_photos[index1].m_projection[m_fm.m_level][1][3];

 

  Mat4 AT = transpose(A);

  Mat4 ATA = AT * A;

  Vec4 ATb = AT * b;

 

  Mat3 ATA3;

  for (int y = 0; y < 3; ++y)

    for (int x = 0; x < 3; ++x)

      ATA3[y][x] = ATA[y][x];

  Vec3 ATb3;

  for (int y = 0; y < 3; ++y)

    ATb3[y] = ATb[y];

 

  Mat3 iATA3;

  invert(iATA3, ATA3);

  Vec3 ans = iATA3 * ATb3;

  for (int y = 0; y < 3; ++y)

    coord[y] = ans[y];

  coord[3] = 1.0f;

}        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值