0

我正在开发一个使用 Android 的增强现实项目。该代码捕获相机视频,找到标记并在其顶部显示一个立方体。在此之后,找到一个运动矢量(以在 x 和 y 方向上移动的像素的形式)。我需要做的是从 GL 层读取像素并在将它们移动运动矢量指定的距离后再次绘制它们。GL 层是使用 GLSurfaceView 类指定的,它是一个透明层。我面临的问题是,当我使用 glReadPixels() 读取像素并将其转换为 480x800 数组(连接一个屏幕分辨率)时,我得到了立方体的 3 个不同部分而不是一个。我打算在此之后通过运动矢量移动像素并使用 glDrawPixels() 将像素放回帧缓冲区请帮助我解释相同的内容。使用 glReadPixels 时我是否缺少某些东西,以及是否有其他功能可以帮助我实现相同的功能。我正在考虑使用 glBlitFrameBuffer() 但这不受 android GL10 类的支持。我附上了我正在读取像素并将它们更改为二维矩阵的代码部分以及我使用 MatLab 重建的像素图像。抱歉,我不允许发布图片。如果有人看到图片后可以帮助我,请在此处发布,我可以将图片邮寄给您。万分感谢 !!!我附上了我正在读取像素并将它们更改为二维矩阵的代码部分以及我使用 MatLab 重建的像素图像。抱歉,我不允许发布图片。如果有人看到图片后可以帮助我,请在此处发布,我可以将图片邮寄给您。万分感谢 !!!我附上了我正在读取像素并将它们更改为二维矩阵的代码部分以及我使用 MatLab 重建的像素图像。抱歉,我不允许发布图片。如果有人看到图片后可以帮助我,请在此处发布,我可以将图片邮寄给您。万分感谢 !!!

任何帮助将不胜感激。

gl.glPixelStorei(GL10.GL_PACK_ALIGNMENT, 1);
        IntBuffer pixels = IntBuffer.allocate(384000);

        gl.glReadPixels(0, 0, 800, 480, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE ,pixels);

            File f = new File ("./mnt/sdcard/Sahiba_PixelData_" + flag + ".txt");

                if(!f.exists())
                    f.createNewFile();
                FileWriter fw = new FileWriter(f);

                int pixelsArr [][] = new int [480][800];
                //int temp[] = pixels.array();
                int n=0;
                for(int i=0; i<480; i++){
                    for(int j=0; j<800; j++){
                        pixelsArr[i][j] = pixels.get(n);
                            //temp[n + pixels.arrayOffset()];
                        fw.write(pixelsArr[i][j] + " ");
                        //fw.write(pixels.get(n) + " ");
                        n++;
                    }
                    //fw.write("\n");
                }

        Log.i("GLLayer", "Pixels reading and storing finished !!!");
        }catch(Exception e){
            Log.i("GLLayer","Exception = " +e);
        }
4

1 回答 1

0

首先,您不应该使用硬编码值,因为系统允许更改实际大小,因此可能会导致异常。尝试使用视口尺寸:

int[] viewportDim=new int[4];
glGetIntegerv(GL10.GL_VIEWPORT,viewportDim);

viewportDim[2] 是宽度,viewportDim[3] 是高度。

gl.glPixelStorei(GL10.GL_PACK_ALIGNMENT,1);

我不确定这是否正确,但我认为 RGBA 应该是 4。

你得到的图像为 800*480,然后你将它保存为 480*800?我认为这也应该是 800*480。

于 2011-03-15T20:21:37.120 回答