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

时间:2017-04-27 03:33:53

标签: android dlib

我之前已经问过类似的问题: - Mobile Vision API - concatenate new detector object to continue frame processing

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

1 个答案:

答案 0 :(得分: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);

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

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

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);

从那里你可以再次将它转换为字节数组,最后在BitmapFactory中使用它。

byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);

我知道,与简单的getBitmap()方法使用相比,它有很多代码,但是如果你真的需要在这种情况下使用位图,它就可以完成这项工作。