È possibile utilizzare Camera2 API con l'API di Google Vision.
Per iniziare, Face Detector dell'API di Google Vision riceve un oggetto Frame che viene utilizzato per analizzare (rilevare volti e relativi punti di riferimento).
L'API Camera1 fornisce i frame di anteprima nel formato di immagine NV21, che è l'ideale per noi. Google Vision Frame.Builder supporta sia setImageData (ByteBuffer in formato immagine NV16, NV21 o YV12) sia setBitmap per utilizzare una bitmap come frame di anteprima da elaborare.
Il problema è che l'API Camera2 fornisce i fotogrammi di anteprima in un formato diverso. È YUV_420_888. Per far funzionare tutto devi convertire i frame di anteprima in uno dei formati supportati.
Una volta ottenuti i frame di anteprima di Camera2 da ImageReader come Image, è possibile utilizzare questa funzione per convertirlo in un formato supportato (NV21 in questo caso).
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;
}
quindi è possibile utilizzare il byte restituita [] per creare una cornice di Google Vision:
outputFrame = new Frame.Builder()
.setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21)
.setId(mPendingFrameId)
.setTimestampMillis(mPendingTimeMillis)
.setRotation(mSensorOrientation)
.build();
Infine, viene chiamato il rivelatore con la cornice creata:
mDetector.receiveFrame(outputFrame);
In ogni caso, se vuoi saperne di più su questo puoi testare il mio esempio di lavoro disponibile gratuitamente su GitHub: Camera2Vision. Spero di aver aiutato :)
Grazie in anticipo, ma ho letto che le informazioni ...: D – Vietnt134