Có thể sử dụng API Camera2 với API Google Vision.
Để bắt đầu, Trình khám khuôn mặt Google Vision API nhận đối tượng Frame sử dụng để phân tích (phát hiện các khuôn mặt và các mốc của nó).
API Camera1 cung cấp khung xem trước ở định dạng hình ảnh NV21, lý tưởng cho chúng tôi. Google Vision Frame.Builder hỗ trợ cả hai setImageData (ByteBuffer ở định dạng hình ảnh NV16, NV21 hoặc YV12) và setBitmap để sử dụng Bitmap làm Khung xem trước để xử lý.
Vấn đề của bạn là API Camera2 cung cấp khung xem trước ở định dạng khác. Đó là YUV_420_888. Để làm mọi thứ hoạt động, bạn phải chuyển đổi khung xem trước thành một trong các định dạng được hỗ trợ.
Khi bạn nhận được khung xem trước Camera2 từ ImageReader là Image, bạn có thể sử dụng chức năng này để chuyển đổi sang định dạng được hỗ trợ (NV21 trong trường hợp này).
private byte[] convertYUV420888ToNV21(Image imgYUV420) {
// Converting YUV_420_888 data to YUV_420_SP (NV21).
byte[] data;
ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();
int buffer0_size = buffer0.remaining();
int buffer2_size = buffer2.remaining();
data = new byte[buffer0_size + buffer2_size];
buffer0.get(data, 0, buffer0_size);
buffer2.get(data, buffer0_size, buffer2_size);
return data;
}
Sau đó, bạn có thể sử dụng các byte trở lại [] để tạo ra một khung Google Vision:
outputFrame = new Frame.Builder()
.setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21)
.setId(mPendingFrameId)
.setTimestampMillis(mPendingTimeMillis)
.setRotation(mSensorOrientation)
.build();
Cuối cùng, bạn gọi các máy dò với Frame tạo:
mDetector.receiveFrame(outputFrame);
Dù sao, nếu bạn muốn biết thêm về điều này, bạn có thể kiểm tra ví dụ làm việc của tôi có sẵn miễn phí trên GitHub: Camera2Vision. Tôi hy vọng tôi đã giúp :)
Cảm ơn trước, nhưng tôi đã đọc thông tin đó ...: D – Vietnt134