web-dev-qa-db-ja.com

処理Androidカメラフレームをリアルタイムで

Androidアプリケーションをカメラフレームをリアルタイムで処理するアプリケーションを作成しようとしています。最初に、カメラが見ているもののグレースケールバージョンを表示したいだけです。管理しましたonPreviewFrameメソッドのバイト配列から適切な値を抽出するには、以下にコードのスニペットを示します。

byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
    pic = new byte[pic_size];
    for(int i = 0; i < pic_size; i++)
    {
        pic[i] = frame[i];
    }
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}

最初 [width*height]の値byte[]フレーム配列は、輝度(グレースケール)値です。それらを抽出した後、それらをイメージとして画面に表示するにはどうすればよいですか? 2D配列でもないので、幅と高さをどのように指定しますか?

26
NavMan

OpenCV4Android SDK から広範なガイダンスを得ることができます。それらの利用可能な例、特に_Tutorial 1 Basic. 0 Android Camera_を調べてください。

しかし、私の場合と同様に、集中的な画像処理の場合、これはリアルタイムの画像処理アプリケーションで許容できる速度よりも遅くなります。 onPreviewFrameのYUVImageへのバイト配列変換の良い置き換え:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

画像と同じサイズの長方形を作成します。

ByteArrayOutputStreamを作成し、これ、長方形、および圧縮値をcompressToJpeg()に渡します。

ByteArrayOutputStream baos = new ByteArrayOutputStream();yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

これらのpreviewFrameをサーフェスにレンダリングすることと、関連するベストプラクティスは新しい次元です。 =)

10
Heartache

この非常に古い投稿が私の注意を引いています。

'11で利用可能なAPIははるかに制限されていました。今日、SurfaceTexture( example を参照)を使用して、(一部の)操作後にカメラストリームをプレビューできます。

1
Alex Cohn