Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实时处理Android相机帧_Android_Image Processing_Camera - Fatal编程技术网

实时处理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()

我正在尝试创建一个Android应用程序来实时处理相机帧。首先,我只想显示相机所看到的东西的灰度版本。我已经设法从
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是一个很好的库,但在这种情况下使用起来有些过头了。