2016-06-01 9 views

Antwort

1

Bitte lesen

camera2 with mobile vision? #65

Ok, ich fand diese

keine kurzfristigen Pläne für eine camera2 Version der CameraSource Klasse Es gibt in der offiziellen API. Da die API jedoch strukturiert ist, könnte eine alternative Version von CameraSource von der Entwickler-Community geschrieben werden, die camera2 verwendet. Alle vorhandenen APIs zum Arbeiten mit Frames und Detektoren reichen aus, um auch eine camera2-Implementierung zu unterstützen.

+0

Danke in fortgeschrittenem, aber ich habe diese Informationen gelesen ...: D – Vietnt134

2

Es ist möglich, Camera2 API mit Google Vision API zu verwenden.

Zunächst erhält der Google Vision API-Gesichtsdetektor ein Objekt Frame, das zur Analyse verwendet wird (Gesichter und seine Orientierungspunkte erkennen).

Die Camera1-API bietet die Vorschaubilder im NV21-Bildformat, was für uns ideal ist. Der Google Vision Frame.Builder unterstützt sowohl setImageData (ByteBuffer im NV16-, NV21- oder YV12-Bildformat) als auch setBitmap, um ein Bitmap als zu bearbeitende Vorschaubilder zu verwenden.

Ihr Problem ist, dass die Camera2-API die Vorschaubilder in einem anderen Format bereitstellt. Es ist YUV_420_888. Damit alles funktioniert, müssen Sie die Vorschaubilder in eines der unterstützten Formate konvertieren.

Sobald Sie die Camera2 Preview Frames von Ihrem ImageReader als Image erhalten haben, können Sie diese Funktion verwenden, um sie in ein unterstütztes Format (in diesem Fall NV21) zu konvertieren.

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; 
} 

Dann können Sie das zurück byte [] verwenden, um einen Google Vision-Rahmen zu erstellen:

outputFrame = new Frame.Builder() 
    .setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21) 
    .setId(mPendingFrameId) 
    .setTimestampMillis(mPendingTimeMillis) 
    .setRotation(mSensorOrientation) 
    .build(); 

Schließlich Sie den Detektor mit dem erstellten Rahmen nennen:

mDetector.receiveFrame(outputFrame); 

Wie auch immer, Wenn Sie mehr darüber wissen möchten, können Sie mein kostenloses Arbeitsbeispiel auf GitHub testen: Camera2Vision. Ich hoffe, ich habe geholfen :)

+0

Ich habe versucht, Daten mit 'convertYUV420888ToNV21()' zu konvertieren, aber es scannt nicht Barcode oder Qrcode überhaupt –

+0

@ LalitPoptani Wenn Sie Probleme haben, zögern Sie nicht, eine neue Ausgabe hier zu öffnen: https://github.com/EzequielAdrianM/Camera2Vision/issues und geben Sie weitere Informationen, damit ich Ihnen helfen kann. –