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配列でもないので、幅と高さをどのように指定しますか?
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をサーフェスにレンダリングすることと、関連するベストプラクティスは新しい次元です。 =)
この非常に古い投稿が私の注意を引いています。
'11で利用可能なAPIははるかに制限されていました。今日、SurfaceTexture( example を参照)を使用して、(一部の)操作後にカメラストリームをプレビューできます。