2016-06-01 16 views

risposta

1

prega di dare un'occhiata

camera2 with mobile vision? #65

Ok, ho trovato questo

non ci sono piani a breve termine per una versione camera2 della classe CameraSource nell'API ufficiale. Tuttavia, dato il modo in cui è strutturata l'API, una versione alternativa di CameraSource potrebbe essere scritta dalla comunità di sviluppatori che utilizza camera2. Tutte le API esistenti per lavorare con frame e rivelatori sono sufficienti per supportare anche l'implementazione di camera2.

+0

Grazie in anticipo, ma ho letto che le informazioni ...: D – Vietnt134

2

È 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 :)

+0

Ho provato a convertire i dati utilizzando 'convertYUV420888ToNV21()' ma non esegue la scansione del codice a barre o qrcode per tutto –

+0

@ LalitPoptani In caso di problemi, non esitare ad aprire un nuovo problema qui: https://github.com/EzequielAdrianM/Camera2Vision/issues e fornire ulteriori informazioni in modo da poterti aiutare. –