私はシンプルなカメラアプリを使用しており、ライブカメラのプレビューをsurfaceView
. ボタンを使用してカメラのオン/オフを切り替えます。ボタンのonClick
で、 を呼び出した後camera.startPreview()
、次を実行します。
camera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
sumRED = 0;
sumGREEN = 0;
sumBLUE = 0;
int frameHeight = camera.getParameters().getPictureSize().height;
int frameWidth = camera.getParameters().getPictureSize().width;
int[] myPixels = convertYUV420_NV21toRGB8888(data, 200, 200);
Bitmap bm = Bitmap.createBitmap(myPixels, 200, 200, Bitmap.Config.ARGB_8888);
imageView.setImageBitmap(bm);
for (int i = 0; i < myPixels.length; i++) {
sumRED = sumRED + Color.red(myPixels[i]);
sumGREEN = sumGREEN + Color.green(myPixels[i]);
sumBLUE = sumBLUE + Color.blue(myPixels[i]);
}
sumRED = sumRED / myPixels.length;
sumGREEN = sumGREEN / myPixels.length;
sumBLUE = sumBLUE / myPixels.length;
String sRed = Float.toString(sumRED);
String sGreen = Float.toString(sumGREEN);
String sBlue = Float.toString(sumBLUE);
rTextView.setText("RED: " + sRed);
gTextView.setText("Green: " + sGreen);
bTextView.setText("Blue: " + sBlue);
}
}
ここから提供されている NV21 から RGB への変換用のコードを使用しています。
私Color.blue(myPixels[i]);
は、RGB カラーに対して行うことで、各ピクセルの色強度を取得し、画像の平均色強度を取得すると考えました。
TextView
しかし、赤と緑がまったく同じ値として表示されることに気付きました。
私が再利用しているコードは、この目的には適していませんか? または、ピクセルの特定の色の強度 (またはライブ ビデオ プレビュー) を取得するための、より適切で好ましい、より効率的な方法はありますか?
ありがとうございました
更新:
最初は、プレビューの出力形式には触れていませんでした。再構築されたビットマップのプレビューは非常に悪かったです。再構築されたビットマップを追加cameraParam.setPreviewFormat(ImageFormat.YV12);
すると、再構築された画像が 4 つの象限に分割されました。カメラを指で覆うと (フラッシュがオンになっているためほとんどオレンジ/赤で表示されていました)、再構築された画像は上の 2 つの象限が紫色で、下の 2 つの象限が緑がかっていました。フォーマットを に変更すると、再構築されたイメージは 1 つのイメージであり、表示されたプレビューとNV21
ほとんど同じでした。すべての RGB カラー間で大きな変化がありました。だから、私の質問は: 画面のほとんどが単色で、255 程度の範囲の値であるのに、なぜ 150 から 160 の範囲の結果が得られるのでしょうか? 私が使用していた変換アルゴリズムは 255 のスケールに変換していると思いました。ここで何が欠けていますか?