我正在开发一个关于Android增强现实的项目。代码捕获摄像机视频,找到标记并在其上显示一个立方体。在此之后,找到运动矢量(以在x和y方向上移动的像素的形式)。我需要做的是从GL图层中读取像素,并在将它们移动运动矢量指定的距离后再次绘制它们。 GL层使用GLSurfaceView类指定,GLSurfaceView类是透明层。我面临的问题是当我使用glReadPixels()读取像素并将其转换为480x800阵列(nexus one screen resolution)时,我得到了3个不同的立方体部分而不是一个。 我打算在此之后通过运动矢量移动像素,并使用glDrawPixels()将像素放回帧缓冲区 请帮我解释一下。使用glReadPixels时是否有一些我遗漏的东西,如果有其他功能可以帮助我实现同样的目标。我在考虑使用glBlitFrameBuffer()但是android GL10类不支持这个。 我已经附加了我正在读取像素的部分代码,并将它们与使用MatLab重建的像素图像一起更改为2D矩阵。 对不起,我不允许发布图片。看到图像后有人可以帮助我,请在这里发帖,我可以把图片邮寄给你。非常感谢!!!
非常感谢任何帮助。
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);
}
答案 0 :(得分: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。