Android 从andar读取变换矩阵

Android 从andar读取变换矩阵,android,augmented-reality,andar,Android,Augmented Reality,Andar,我正在开发一个基于android的跟踪系统,使用android上的摄像头和其他传感器。我感兴趣的是从AndAR读取变换矩阵,而不是在检测到标记时显示某些对象(例如立方体)。我有另一个使用ARToolkit风格开发的跟踪系统,称为jARToolkit,它运行在桌面机器上,并给出网络摄像机和模式之间的转换矩阵。 现在我从AndAR得到了转换矩阵,但是如果我们把它和我从jARToolkit得到的转换矩阵相比较,它是完全不同的。原因可能是以下问题- 我在android上看到的曲面预览总是旋转90度。因此

我正在开发一个基于android的跟踪系统,使用android上的摄像头和其他传感器。我感兴趣的是从AndAR读取变换矩阵,而不是在检测到标记时显示某些对象(例如立方体)。我有另一个使用ARToolkit风格开发的跟踪系统,称为jARToolkit,它运行在桌面机器上,并给出网络摄像机和模式之间的转换矩阵。 现在我从AndAR得到了转换矩阵,但是如果我们把它和我从jARToolkit得到的转换矩阵相比较,它是完全不同的。原因可能是以下问题-

  • 我在android上看到的曲面预览总是旋转90度。因此,平移矩阵中的X和Y坐标交换它们的位置
  • 我不确定转换矩阵的单位。在物理世界中,它大约是每厘米4个单位,但我无法验证这一点
  • 如果有人能帮我解决这些问题或让我知道我是否遗漏了什么,我将不胜感激。提前谢谢

    下面是我正在使用的代码。它与AndAR文档中的内容几乎相同

    boolean keepRunning = true;
    try {
        ARToolkit artoolkit = getArtoolkit();
        CustomObject object_hiro = new CustomObject("test_hiro", "hiro.patt", 80.0,new double[] { 0, 0 });
        artoolkit.registerARObject(object_hiro);
    }
    catch (AndARException ex)
    {       
        System.out.println("");
    }
    while(keepRunning)
    {
        double[] transMatrix = (double[]) object_hiro.getTransMatrix();
    }
    
    下面是CustomObject.java-

    import java.nio.FloatBuffer;
    import javax.microedition.khronos.opengles.GL10;
    import edu.dhbw.andar.ARObject;
    import edu.dhbw.andar.pub.SimpleBox;
    import edu.dhbw.andar.util.GraphicsUtil;
    
    /**
     * An example of an AR object being drawn on a marker.
     * @author tobi
     *
     */
    public class CustomObject extends ARObject {
    
        public CustomObject(String name, String patternName,
                double markerWidth, double[] markerCenter) {
            super(name, patternName, markerWidth, markerCenter);
            float   mat_ambientf[]     = {0f, 1.0f, 0f, 1.0f};
            float   mat_flashf[]       = {0f, 1.0f, 0f, 1.0f};
            float   mat_diffusef[]       = {0f, 1.0f, 0f, 1.0f};
            float   mat_flash_shinyf[] = {50.0f};
    
            mat_ambient = GraphicsUtil.makeFloatBuffer(mat_ambientf);
            mat_flash = GraphicsUtil.makeFloatBuffer(mat_flashf);
            mat_flash_shiny = GraphicsUtil.makeFloatBuffer(mat_flash_shinyf);
            mat_diffuse = GraphicsUtil.makeFloatBuffer(mat_diffusef);
    
        }
        public CustomObject(String name, String patternName,
                double markerWidth, double[] markerCenter, float[] customColor) {
            super(name, patternName, markerWidth, markerCenter);
            float   mat_flash_shinyf[] = {50.0f};
            mat_ambient = GraphicsUtil.makeFloatBuffer(customColor);
            mat_flash = GraphicsUtil.makeFloatBuffer(customColor);
            mat_flash_shiny = GraphicsUtil.makeFloatBuffer(mat_flash_shinyf);
            mat_diffuse = GraphicsUtil.makeFloatBuffer(customColor);
    
        }
    
        private SimpleBox box = new SimpleBox();
        private FloatBuffer mat_flash;
        private FloatBuffer mat_ambient;
        private FloatBuffer mat_flash_shiny;
        private FloatBuffer mat_diffuse;
    
    
        /**
         * Everything drawn here will be drawn directly onto the marker,
         * as the corresponding translation matrix will already be applied.
         */
        @Override
        public final void draw(GL10 gl) {       
            super.draw(gl);
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,mat_flash);
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, mat_flash_shiny);    
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);  
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);
    
            //draw cube
            gl.glColor4f(1.0f, 0f, 0, 1.0f);
            gl.glTranslatef( 0.0f, 0.0f, 12.5f );
    
            box.draw(gl);      
        }
    
        @Override
        public void init(GL10 gl) {
            // TODO Auto-generated method stub
    
        }
    }
    

    如果我需要提供更多信息,请告诉我。。感谢

    原始C ARToolKit有两种类型的转换与标记关联:

    • 一个3x4矩阵(来自姿势估计的计算机视觉矩阵,从arGetTransMat获得)

    • 4x4矩阵(类似OpenGL的矩阵,使用上述3x4矩阵从argConvGLcpara获得)

    在安达:

    • 3x4矩阵:可通过从ARObject调用getTransMatrix()获得
    • 4x4矩阵:不能从ARObject公开访问,矩阵存储在glCameraMatrix中(请参阅ARObject.java的代码)
    在JARToolKit中:

    • 3x4矩阵:可以通过调用getTransMatrix获得
    • 4x4矩阵:可通过调用getCamTransMatrix获得
    也许您可以访问AndAR和JARToolKit之间的不同矩阵


    单位与标记大小有关。通常以mm为单位,对象声明中的参数_hiro:80.0表示80mm宽。您可以将标记打印到此大小,以便在物理对象和虚拟内容之间获得匹配。

    感谢您的回复Raphael;但我在AndAR中使用getTransMatrix()方法,仍然得到一个4X4矩阵(转换为double[])。关于单位,我将尝试使用不同大小的标记,并比较变换矩阵。再次感谢你的回复。。