从显示实时摄像头的 SurfaceView 获取 RGB

Kin*_*oul 4 rgb camera android colors surfaceholder

我正在SurfaceView使用camera.startPreview();. 关于如何从相机获取实时 RGB 读数的任何想法?

谢谢

Kin*_*oul 5

我以为我可以得到从SurfaceView. 但最好的使用方法是:

  • 将相机的方向设置为 90 度。
  • 将输出格式设置为 NV21(保证所有设备都支持)。
  • 设置为打开闪光灯。
  • 中开始预览SurfaceView

项目清单

camera = Camera.open();
cameraParam = camera.getParameters();
cameraParam.setPreviewFormat(ImageFormat.NV21);
camera.setDisplayOrientation(90);
camera.setParameters(cameraParam);
cameraParam = camera.getParameters();
camera.setPreviewDisplay(surfaceHolder);
cameraParam.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(cameraParam);
camera.startPreview();
Run Code Online (Sandbox Code Playgroud)

然后,我调用setPreviewCallbackonPreviewFrame获取传入帧,并将其转换为 RGB 像素数组。然后我可以通过for循环运行 myPixels 数组来平均所有像素强度,并检查Color.red(myPixels[i])每种所需的颜色(在onPreviewFrame.

camera.setPreviewCallback(new PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        int frameHeight = camera.getParameters().getPreviewSize().height;
        int frameWidth = camera.getParameters().getPreviewSize().width;
        // number of pixels//transforms NV21 pixel data into RGB pixels  
        int rgb[] = new int[frameWidth * frameHeight];
        // convertion
        int[] myPixels = decodeYUV420SP(rgb, data, frameWidth, frameHeight);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里decodeYUV420SP可以找到这里

我将此操作计时为每帧大约需要 200 毫秒。有没有更快的方法?