2011-03-15 3 views
0

Android에서 Augmented Reality 프로젝트를 진행 중입니다. 코드는 카메라 비디오를 캡처하고 마커를 찾고 그 위에 큐브를 표시합니다. 이 후 모션 벡터 (x 및 y 방향으로 움직이는 픽셀의 형태로)가 발견됩니다. 내가해야할 일은 GL 레이어의 픽셀을 읽고 움직임 벡터로 지정된 거리만큼 움직여서 다시 그려줍니다. GL 레이어는 투명 레이어 인 GLSurfaceView 클래스를 사용하여 지정됩니다. 내가 직면 한 문제는 glReadPixels()를 사용하여 픽셀을 읽고이를 480x800 배열 (넥서스 한 화면 해상도)로 변환 할 때 큐브의 3 가지 부분을 하나가 아닌 다른 부분으로 가져옵니다. 이후에 모션 벡터로 픽셀을 이동하고 glDrawPixels()를 사용하여 픽셀을 프레임 버퍼에 다시 넣으려고합니다. 동일한 해석으로 도와주세요. glReadPixels를 사용할 때 누락 된 것이 있습니까? 또한 동일한 기능을 수행하는 데 도움이되는 다른 기능이있는 경우 glBlitFrameBuffer()를 사용하려고 생각했지만 안드로이드 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

신속한 회신과 Viewport에 대한 지식에 감사드립니다. 나는 치수를 얻기 위해 그것을 사용할 것이다. – Sahiba

+0

신속한 회신과 Viewport에 대한 지식에 감사드립니다. 나는 치수를 얻기 위해 그것을 사용할 것이다. glPixelStorei 함수에 관해서는이 정보를 온라인에서 찾았습니다 : * GL_PACK_ALIGNMENT 메모리의 각 픽셀 행의 시작에 대한 정렬 요구 사항을 지정합니다. 허용되는 값은 1 (바이트 정렬), 2 (짝수 바이트에 정렬 된 행), 4 (단어 맞춤) 및 8 (더블 워드 경계에서 시작하는 행)입니다. 초기 값은 4입니다. * 바이트 데이터를 저장하기 위해이 값을 사용하면 param 값을 1로 사용해야합니다. 내가 틀렸다면 나를 바로 잡아라. – Sahiba

+0

이미지 크기가 800x480 인 이미지를 얻으려는 경우 800 행 480 열 또는 그 반대로 표시된다는 의미입니까? Google Nexus의 사양에 따르면 디스플레이 크기는 480x800 픽셀로 480 행과 800 열로 해석되므로 왼쪽 하단에서 시작하여 이미지를 저장합니다 (예 : 행 480, 열 1에서 열 800까지). 그런 다음 행 479)이 해석이 맞습니까? * 고마워요 * – Sahiba

관련 문제