实时处理Android相机帧
我正在尝试创建一个Android应用程序来实时处理相机帧。首先,我只想显示相机所看到的东西的灰度版本。我已经设法从实时处理Android相机帧,android,image-processing,camera,Android,Image Processing,Camera,我正在尝试创建一个Android应用程序来实时处理相机帧。首先,我只想显示相机所看到的东西的灰度版本。我已经设法从onPreviewFrame方法中的字节数组中提取了适当的值。下面是我的代码片段: byte[] pic; int pic_size; Bitmap picframe; public void onPreviewFrame(byte[] frame, Camera c) { pic_size = mCamera.getParameters().getPreviewSize()
onPreviewFrame
方法中的字节数组中提取了适当的值。下面是我的代码片段:
byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
pic = new byte[pic_size];
for(int i = 0; i < pic_size; i++)
{
pic[i] = frame[i];
}
picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}
byte[]pic;
图片大小;
位图帧;
预览帧上的公共无效(字节[]帧,摄像机c)
{
pic_size=mCamera.getParameters().getPreviewSize().height*mCamera.getParameters().getPreviewSize().width;
pic=新字节[pic_size];
对于(int i=0;i
字节[]
帧数组的第一个[width*height]
值是亮度(灰度)值。提取它们后,如何在屏幕上显示为图像?它也不是2D阵列,因此如何指定宽度和高度?您可以从。查看他们的可用示例,特别是tutorial1basic。0安卓摄像头
但是,在我的例子中,对于密集图像处理,这将比实时图像处理应用程序的速度慢。
很好地替代了PreviewFrame的字节数组到YUVImage的转换:
YuvImage YuvImage=新的YuvImage(帧,ImageFormat.NV21,宽度,高度,空)代码>
创建一个与图像大小相同的矩形
创建ByteArrayOutputStream并将其、矩形和压缩值传递给compressToJpeg():
ByteArrayOutputStream=newbytearrayoutputstream()代码>
yuvimage.compressToJpeg(imageSizeRectangle,100,baos)代码>
byte[]imageData=bas.toByteArray()代码>
Bitmap previewBitmap=BitmapFactory.decodeByteArray(imageData,0,imageData.length)代码>
在曲面上渲染这些预览帧以及所涉及的最佳实践是一个新维度。=) 在当前Android工具/API可用的情况下,这不是一项容易实现的任务。通常,实时图像处理最好在NDK级别完成。为了只显示黑白,您仍然可以用java来完成。包含帧数据的字节数组采用YUV格式,其中Y平面位于第一位。因此,如果只得到Y平面(第一个宽度x高度字节),它已经给出了黑白
我是通过广泛的工作和试验才做到这一点的。您可以在谷歌上查看该应用程序:
这篇非常古老的帖子现在引起了我的注意
11年可用的API要有限得多。如今,人们可以使用SurfaceTexture(请参阅)在(某些)操作后预览相机流。是否会将YUV图像转换为带有中间JPEG的位图?这几乎不是一个可行的实时解决方案。我强烈建议不要这样做。android上的OpenCV将增加项目的复杂性,还需要大约10mb大小的本机库。安卓确实拥有完成OP所需的所有功能。OpenCV是一个很好的库,但在这种情况下使用起来有些过头了。