我知道類似的問題已經被問之前: - 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()
方法的使用,但它會做的工作,如果你真的需要那種情況的位圖。
你有什麼解決方案嗎? –