在Android中查找相对方向

时间:2017-06-08 20:36:37

标签: android opencv rotation augmented-reality virtual-reality

我正在构建一个AR应用程序,其中相机预览中的对象被计算机视觉算法(solvePnP)跟踪。我想让这种体验更顺畅,并使用手机的陀螺仪在solvePnP结果之间旋转对象。执行此操作的第一步是运行solvePnP一次,在屏幕上投射点,然后依靠方向来跟踪对象(我确保不要过多地翻译手机)。

理想的效果是,如果我将手机保持在纵向模式,直立,相机指向某个感兴趣的物体。如果我围绕其垂直轴正向旋转手机,我希望屏幕上的相应对象围绕其垂直轴旋转。我使用Sensor.TYPE_ROTATION_VECTOR从手机中获取四元数。

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {

        if (!didInitRotation) {

           SensorManager.getRotationMatrixFromVector(mInitialRotationMatrix, event.values);

            didInitRotation = true;
        }

        SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);

        float[] rotationMatrixInverse = new float[16];
        float[] relativeOrientation = new float[16];

        Matrix.invertM(rotationMatrixInverse, 0, mRotationMatrix, 0);
        Matrix.multiplyMM(relativeOrientation, 0, rotationMatrixInverse, 0, mInitialRotationMatrix, 0);

        mGLAssetSurfaceView.getRenderer().setRotationMatrix(relativeOrientation);
    }
}

正如你所看到的,我提到了一些"初始旋转矩阵"然后将其乘以当前旋转矩阵的倒数以得到相对定向。然后我将它应用于OpenGL中的视图矩阵。

结果是TYPE_ROTATION_VECTOR表现得很奇怪。如果我绕着x轴旋转手机,我会看到屏幕上的物体从屏幕的一个角落对角线移动到另一个角落。

0 个答案:

没有答案
相关问题