2016-10-03 4 views
0

Hat jemand die verpackte Xamrin-Version davon benutzt? https://components.xamarin.com/view/emgucv-v3Kameravorschau auf Portrait Android OpenCV Kamera und Xamarin drehen

Ich habe diese Lizenz kürzlich gekauft und treffe genau die gleichen Probleme wie hier beschrieben (Rotate camera preview to Portrait Android OpenCV Camera). Habe eine Vielzahl von Ansätzen verwendet.

Zuerst drehen Sie die Bildschirmausrichtung von Querformat zu Hochformat, aber dies zeigt einfach den Strom in der gleichen gedrehten Form (90 Grad). Landschaft scheint die einzige zu sein, die so funktioniert, wie ich es möchte.

Ich habe versucht, die Kamera selbst mit dem Kameraobjekt zu drehen, aber das behebt das Problem auch nicht.

dh
camera.SetDisplayOrientation(90); 

Ich habe dies eine große Anzahl von Zeiten debuged zu sehen, wo die Ausführung auftritt, und es scheint, dass zunächst der Bildschirm korrekt eingestellt ist, sondern durch die Zeit

protected override void OnDraw(Android.Graphics.Canvas canvas) 

betrieben, um die hinzufügen FPS Text hat es umgedreht.

Ich habe auch versucht, das Bild mit Matrix zu spiegeln, aber das senkt die Bildrate von ca. 20FPS auf ca. 6FPS. Das ist zu viel von. ein Hit

Wirklich hier zu kämpfen, da dies jetzt der größte Stolperstein zum Aufbau meiner App ist.

Ich bin ziemlich neu zu Xamarin, so dass jede Hilfe sehr geschätzt wird.

P.S. Entschuldigung. Ich weiß, dass dies von einem anderen Thread (Rotate camera preview to Portrait Android OpenCV Camera) abgedeckt wurde, und ich habe alle Optionen dort ausprobiert, aber dieser Eintrag wurde von Ed Cotrell (Admin) aus diesem Thread gelöscht und ich wurde aufgefordert, einen neuen zu starten.

Antwort

1

OK, ich denke, ich habe es !!!

Es scheint, dass das OpenCV-Beispiel in Xamarin den unbearbeiteten Stream aus dem Puffer verwendet und standardmäßig in einem 90-Grad-Winkel erscheint, unabhängig von der Ausrichtung des UI-Layouts oder der Einstellungen/Parameter für die Kamera.

So, überarbeitete ich den Code innerhalb ProcessedCameraPreview

protected override void OnDraw(Android.Graphics.Canvas canvas) 

Ursprünglich war ich Objektbild unten zu einer nativen Android Bitmap konvertieren und zu drehen. Der Performance-Hit war riesig.

Image<Bgr, byte> image = _bgrBuffers.GetBuffer(0); 

Also, ich dachte, wenn ich folgendes getan: -

Image<Bgr, byte> rotateImage = image.Rotate(90, new Bgr(System.Drawing.Color.Black)); 
canvas.DrawBitmap(rotateImage.ToBitmap(), 0, 0, _paint); 

Es wäre auf dem 90-Grad-Winkel nach Bedarf machen. Leistungseinbußen waren nicht wirklich bemerkbar.

Ich habe jetzt das Bildobjekt, das ich brauche, um die OpenCV-Funktionen auszuführen, mit denen ich arbeiten möchte.

P.S. Eine andere bemerkenswerte Option, die auch funktionierte, war das Drehen des Canvas mit: -

Matrix matrix = new graphics.Matrix(); 
matrix.PostRotate(90); 
DrawBitmap(image.ToBitmap(), matrix, _paint); 

Noch einmal Leistungseinbußen war nicht bemerkbar.