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 个象限。当我用手指盖住相机时(由于闪光灯打开而显示为橙色/红色),重建的图像在顶部两个象限为紫色,在底部两个象限呈绿色。当我将格式更改为 时NV21,重建的图像是单个图像,并且显示的预览几乎相同,并且所有 RGB 颜色之间都有显着的变化。所以,我的问题是:为什么我得到的结果在 150-160 的范围内,而大部分屏幕是单色的,而值在 255 左右的范围内?我以为我使用的转换算法正在转换为 255 的比例。我在这里缺少什么?

4

0 回答 0