我试图从相机预览捕捉图像并对其进行一些绘制。问题是,我只有大约3-4fps的绘图,并且一半的帧处理时间是从相机预览接收和解码NV21图像并转换为位图。我有一个代码来完成这个任务,我在另一个堆栈问题上找到了。它似乎并不快,但我不知道如何优化它。 Samsung Note 3大约需要100-150 ms,图像尺寸为1920x1080。我怎样才能让它工作得更快?Yuv(NV21)图像转换为位图
代码:
public Bitmap curFrameImage(byte[] data, Camera camera)
{
Camera.Parameters parameters = camera.getParameters();
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
{
YuvImage img = new YuvImage(data, ImageFormat.NV21, prevSizeW, prevSizeH, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
img.compressToJpeg(new android.graphics.Rect(0, 0, img.getWidth(), img.getHeight()), 50, out);
byte[] imageBytes = out.toByteArray();
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
else
{
Log.i(TAG, "Preview image not NV21");
return null;
}
}
图像的最终格式必须是位图,这样的话我可以做它的处理。我试图将Camera.Parameters.setPreviewFormat设置为RGB_565,但无法将相机参数分配给相机,我也读过NV21是唯一可用的格式。我对此不确定,是否有可能在这些格式变化中找到解决方案。
预先感谢您。
最快的方法是使用RenderScript内在,但问题是为什么你需要这么多的位图每秒?绘制这些位图或存储它们将成为流量的下一个瓶颈,速度为10 FPS或更少 –
谢谢。我的任务是在相机预览的文本字段周围绘制矩形,所以当相机移动时,我想让文本字段周围的边界保持移动,并在新找到的文本字段周围查找和绘制矩形(因此,跟踪在此处不起作用) 。这是我第一次做这样的事情,比如实时画相机预览,所以也许你有任何建议或意见,也许我在这里做了一些非常错误的事情? –
考虑通过OpenGL渲染矩形;您不能显示SurfaceTexture来渲染相机预览,因为您的矩形将以延迟显示(识别和追踪算法)。更好地使用着色器手动呈现YUV预览帧,完美地与您的矩形同步。也许您的识别和跟踪算法也可能被调整为依赖于YUV数据而不是RGB? –