我知道类似的问题已经被问之前: - Mobile Vision API - concatenate new detector object to continue frame processing移动视觉API新探测器帧得到位图图像
我收到的帧,但是当我打电话frame.getBitmap()返回一个空的对象。 我想在https://github.com/tzutalin/dlib-android-app (Android dlib库)FaceDet函数中使用这个位图。
我知道类似的问题已经被问之前: - Mobile Vision API - concatenate new detector object to continue frame processing移动视觉API新探测器帧得到位图图像
我收到的帧,但是当我打电话frame.getBitmap()返回一个空的对象。 我想在https://github.com/tzutalin/dlib-android-app (Android dlib库)FaceDet函数中使用这个位图。
根据移动视觉API文档,Frame
对象有方法getBitmap()
但它明确指出,
getBitmap()
返回其在创建该帧中指定的位图,或者如果不使用位图空创建这个框架。
如果你真的想获得位图对象,你将不得不自己创建它。一个选项是getGrayscaleImageData()
方法Frame
对象。
如果返回ByteBuffer
中有一些字节,则可以将其转换为Bitmap
。
首先,您必须使用getGrayscaleImageData()
结果中的字节数组创建YuvImage
。这是一个必需的步骤,因为字节数组的图像颜色空间为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()
方法的使用,但它会做的工作,如果你真的需要那种情况的位图。
你有什么解决方案吗? –