2011-03-15 39 views
0

我正在使用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); 
     } 

回答

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。

+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