0

Android を使用した拡張現実に関するプロジェクトに取り組んでいます。コードはカメラ ビデオをキャプチャし、マーカーを見つけて、その上に立方体を表示します。この後、モーション ベクトル (x 方向と y 方向に移動したピクセルの形式) が検出されます。私がする必要があるのは、GLレイヤーからピクセルを読み取り、モーションベクトルで指定された距離だけ移動した後、再度描画することです。GL レイヤーは、透明レイヤーである GLSurfaceView クラスを使用して指定されます。私が直面している問題は、glReadPixels() を使用してピクセルを読み取り、それを 480x800 配列 (nexus 1 画面解像度) に変換すると、キューブの 1 つではなく 3 つの異なる部分が得られることです。この後、ピクセルをモーションベクターで移動し、glDrawPixels() を使用してピクセルをフレームバッファーに戻すつもりです。同じ解釈を手伝ってください。glReadPixels を使用しているときに欠けているものはありますか?また、同じことを達成するのに役立つ他の機能があるかどうかもわかりません。glBlitFrameBuffer() を使用することを考えていましたが、これは Android GL10 クラスではサポートされていません。ピクセルを読み取って、MatLab を使用して再構築したピクセルの画像と共に 2D マトリックスに変更するコードの一部を添付しました。申し訳ありませんが、画像の投稿は許可されていません。画像を見て誰かが私を助けてくれる場合は、ここに投稿してください。写真を郵送できます. トンありがとう!!! ピクセルを読み取って、MatLab を使用して再構築したピクセルの画像と共に 2D マトリックスに変更するコードの一部を添付しました。申し訳ありませんが、画像の投稿は許可されていません。画像を見て誰かが私を助けてくれる場合は、ここに投稿してください。写真を郵送できます. トンありがとう!!! ピクセルを読み取って、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);
        }
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 に答える