0

私はシンプルなカメラアプリを使用しており、ライブカメラのプレビューを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 のスケールに変換していると思いました。ここで何が欠けていますか?

4

0 に答える 0