2017-07-12 3 views
0

In meinem benutzerdefinierten Detektor möchte ich Bild von Rahmen in Hälften teilen, um sie getrennt zu verarbeiten. Dies ist, was ich in meiner Gewohnheit so weit gekommen Detector:Teilen google-vision frame in zwei

val imageArray = frame?.grayscaleImageData?.array() 
    val upperImageBuffer = ByteBuffer 
           .allocate(imageArray?.size ?: 0) 
           .put(imageArray, 0, imageArray?.size?.div(2) ?: 0) 
val upperFrame = Frame.Builder(). 
      setImageData(upperImageBuffer, 
       frame?.metadata?.width ?: 0, 
       frame?.metadata?.height?.div(2) ?: 0, 
       frame?.metadata?.format ?: 16). 
      setRotation(frame?.metadata?.rotation ?: 0). 
      build() 

val lowerFrame... etc 

val upperDetections = delegateDetector.detect(upperFrame) 
upperDetections.forEach { key, barcode -> 
    if (barcode is Barcode) results.append(key, barcode) 
} 

val lowerDetections = delegateDetector.detect(lowerFrame) etc. 

Bisher habe ich den gleichen Detektor auf beide verwenden (dies tatsächlich ist zu überprüfen, ob ich werde mehr Ergebnisse erkennen als in ganzen Rahmen - so dumm wie es klingt, aber ich lasse die Frage so wie sie ist, denn vielleicht müsste jemand in Zukunft einen Teil des Bildes von einem Detektor und einen anderen von einem anderen verarbeiten lassen.

Noch ist das Problem: Ich bekomme die gleichen Ergebnisse für beide Hälften und tatsächlich die gleichen wie aus dem ursprünglichen Rahmen. Was mache ich falsch?

Antwort

1

grayscaleImageData von CameraSource enthält auch Farbe, ist aber dem Graustufen-Kanal vorangestellt. Das heißt, es wurde als YUV formatiert und nicht nur als Y-Kanal (Graustufen).

Verwenden Sie anstelle von imageArray.size also frame.width * frame.height als Größe.

+0

yeah, im Grunde habe ich gerade herausgefunden, dass ich mich total geirrt habe, was in meinem Code vorgeht, also muss ich die Frage neu formulieren. Vielleicht morgen, jetzt viel Arbeit, leider. Das war es, was ich am Ende benutzt habe. – Antek