我以为我可以从SurfaceView转换数据.但最好的方法是:
>将相机的方向设置为90度.
>将输出格式设置为NV21(所有设备均支持guranteed).
>设置为打开闪光灯.
>在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();
然后,我调用setPreviewCallback和onPreviewFrame来获取传入帧,并将其转换为RGB像素阵列.然后,我可以通过运行myPixels数组通过for循环平均所有像素强度来获得图片中每种颜色的强度,并检查每个所需颜色的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);
}
}
其中decodeYUV420SP的编号为here.
我将这个操作计时为每帧约200ms.有更快的方法吗?