我之前已经问过类似的问题: - 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函数。
答案 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);
width
和height
可以通过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()
方法使用相比,它有很多代码,但是如果你真的需要在这种情况下使用位图,它就可以完成这项工作。