glReadPixels()Android中重构帧的问题

问题描述:

我正在使用Android进行增强现实项目。该代码捕获相机视频,找到标记并在其上显示立方体。在此之后,找到运动矢量(以在x和y方向上移动的像素的形式)。我需要做的是从GL层读取像素,并在将它们移动运动矢量指定的距离后再次绘制它们。 GL层是使用GLSurfaceView类(它是透明层)指定的。我面临的问题是,当我使用glReadPixels()读取像素并将其转换为480x800阵列(nexus一个屏幕分辨率)时,我得到立方体的3个不同部分而不是1个。 我打算在此之后通过运动矢量移动像素,并使用glDrawPixels()将像素放回帧缓冲区 请帮助我解释相同的。在使用glReadPixels的时候有什么我不明白的地方,以及是否有其他的功能可以帮助我达到同样的效果。我正在考虑使用glBlitFrameBuffer(),但不支持android GL10类。 我已经附加了代码的一部分,我正在读取像素,并将它们与使用MatLab重建的像素图像一起更改为2D矩阵。 对不起,我不允许发布图片。在看到图像后,有人可以帮助我,请张贴在这里,我可以邮寄给你的图片。万分感谢 !!!glReadPixels()Android中重构帧的问题

任何帮助将不胜感激。

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); 
     } 

首先,你没有使用硬编码值,因为系统被允许改变实际大小,所以它可能导致异常。尝试使用视口尺寸:

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。

+0

感谢您的及时回复和关于视口的知识。我会用它来获得尺寸。 – Sahiba 2011-03-16 03:00:22

+0

感谢您的及时回复和关于视口的知识。我会用它来获得尺寸。关于glPixelStorei函数,我在线找到了这些信息:* GL_PACK_ALIGNMENT 指定内存中每个像素行起始的对齐要求。允许值为1(字节对齐),2(与偶数字节对齐的行),4(字对齐)和8(行在双字边界上开始)。 *初始值是4. *为了保存字节数据,我应该使用param值作为1对吗?如果我错了,请纠正我。 – Sahiba 2011-03-16 03:06:04

+0

对于图像大小,当你说我得到的图像为800x480,你的意思是有800行480列或其他方式。根据Google Nexus的规格,显示屏尺寸为480x800像素,我将其解释为480行和800列,因此将图像从左下角开始保存(即第480行,第1列至第800列,然后转到第479)这个解释是否正确? *谢谢大家* – Sahiba 2011-03-16 03:11:08