我使用的显示实时摄像机 SurfaceView
camera.start preVIEW();
。我如何能获取实时RGB读数相机任何想法?
I am displaying a live camera in SurfaceView
using camera.startPreview();
. Any idea on how I can get live RGB readings from the camera?
感谢
推荐答案
我想我能得到从 SurfaceView
转换数据。但是,使用最好的方法是:
I thought I could get the data converted from the SurfaceView
. But the best method to use is :
SurfaceView
。
Set the camera's orientation to 90 degrees.
Set output format to NV21 (which is guranteed to be supported on all devices).
Set to turn the Flash ON.
Start preview in the 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();
然后,我称之为设置previewCallback
和在previewFrame
获得进入框架,并把它转换为RGB像素阵列。我可以再得到的图像中每种色彩的强度由通过为
循环运行myPixels阵列,并检查 Color.red平均所有像素的强度(myPixels [I])
为每个想要的颜色(上previewFrame的在
)。
Then, I call the setPreviewCallback
and onPreviewFrame
to get the incoming frame, and convert it to RGB pixel array. Which I can then get intensity of each color in the picture by averaging all pixels intensity by running myPixels array through a for
loop, and checking Color.red(myPixels[i])
for each desired color (inside the 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);
}
}
其中,德codeYUV420SP
找到的这里。
我计时这个操作需要大约200毫秒的每一帧。 有没有做这件事的一个更快的方法?的
I timed this operation to take about 200ms for each frame. Is there a faster way of doing it?
相关推荐
最新文章