Mobile Vision API新探测器框架获取位图图像

Hon*_*yal 7 android dlib

我知道之前已经问过类似的问题: - Mobile Vision API - 连接新的探测器对象以继续帧处理

我正在接收帧但是当我调用frame.getBitmap()时它返回一个null对象.我想在https://github.com/tzutalin/dlib-android-app(Android dlib Library)FaceDet函数中使用此位图.

小智 1

根据 Mobile Vision API 文档,Frame对象有方法getBitmap(),但明确指出

getBitmap()
返回创建此帧时指定的位图,如果没有使用位图创建此帧,则返回 null。

如果您确实想获取 Bitmap 对象,则必须自己创建它。一种选择是通过对象getGrayscaleImageData()上的方法Frame
如果返回的有一些字节ByteBuffer,您可以将其转换为Bitmap.

首先,您必须YuvImage使用结果中的字节数组进行创建getGrayscaleImageData()。这是强制性步骤,因为字节数组具有YUV / YCbCr颜色空间中的图像,以NV21格式编码。所以第一行看起来像这样:

YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
Run Code Online (Sandbox Code Playgroud)

width并且可以通过/方法height从框架中提取。getMedatada().getHeight()getMedatada().getWidth()

然后您可以使用它ByteArrayOutputStream来快速压缩您的YuvImage对象。

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
Run Code Online (Sandbox Code Playgroud)

从那里您可以再次将其转换为字节数组,最终在BitmapFactory.

byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
Run Code Online (Sandbox Code Playgroud)

我知道与简单的getBitmap()方法使用相比,它需要大量代码,但如果您在这种情况下确实需要位图,它就可以完成工作。