嗨,我正在android上开发实时图像处理应用程序。我使用PreviewCallback在每一帧中获取图像。当我在平板设备上获取数据时,返回的数据非常大。因此,实时处理大数据太难了。我的问题是,有没有办法从相机预览中获得较小的分辨率数据。
摄像头预览代码:
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Camera.Parameters params = camera.getParameters();
Log.v("image format", Integer.toString(params.getPreviewFormat()));
//Frame captureing via frameManager
frameManager.initCamFrame(params.getPreviewSize().width, params.getPreviewSize().height,
data);
}
});发布于 2011-12-04 10:56:39
您可以调用参数.setPreviewSize(width,height),但您希望在摄像头预览开始之前这样做。并且你需要使用支持的值,也就是之前的答案。
你也不应该每一帧都调用camera.getParameters(),只需调用一次并将值保存到某个变量即可。您在onPreviewFrame中有一些有限的时间,因为byte[]数据在每一帧上都会被覆盖,所以尝试在这里只做重要的事情。
你应该使用setPreviewCallbackWithBuffer,它可以很好地提高性能--请检查this post。
发布于 2011-12-04 10:29:52
您是否知道您可以通过调用getSupportedPreviewSizes()从相机参数中获取支持的预览大小列表?我尝试过的所有设备都返回了一个排序列表,尽管有时是升序的,有时是降序的。您可能希望手动迭代列表以找到“最小”预览大小,或者首先对其进行排序并获取第一项。
发布于 2015-10-15 21:13:44
您可以尝试这样做:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
try {
byte[] baos = convertYuvToJpeg(data, camera);
StringBuilder dataBuilder = new StringBuilder();
dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
mSocket.emit("newFrame", dataBuilder.toString());
} catch (Exception e) {
Log.d("########", "ERROR");
}
}
};
public byte[] convertYuvToJpeg(byte[] data, Camera camera) {
YuvImage image = new YuvImage(data, ImageFormat.NV21,
camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = 20; //set quality
image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality
return baos.toByteArray();
}https://stackoverflow.com/questions/8372431
复制相似问题