Ich versuche, einige Anwendungen mit OpenCv4Android für Android-Geräte zu schreiben. Früher habe ich Android NDK und C ++ native Codes verwendet. Aber diese Technik war nicht sehr klar. Also bin ich zur neuesten Java API gewechselt, die mit der OpenCv 2.4.4 Version geliefert wird.
Ich konnte einfache Programme schreiben und Samples ausführen. Aber, während ich versuchte, einige Codes für fortgeschrittene Probleme wie - Modell POSE Schätzung, Kamera Kalibrierung Routinen usw. zu schreiben, stieß ich auf diese sehr seltsame Verwirrung. Einige der Datentypen, deren Namen in C ++ API sehr intuitiv sind, passen nicht wirklich in ihr Java-Gegenstück. Daher habe ich große Schwierigkeiten, meine Funktionalität von C ++ nach Java zu portieren. Ich bin in diesen Funktionen völlig verwirrt.
Bitte helfen Sie mir, die in OpenCv Java verwendeten Begriffe und ihre Analogie zu C ++ zu verstehen.
Bitte schlagen Sie mir auch eine Referenz vor, wo eine klare und klare Beschreibung dieser Begriffe gegeben wird (ich habe versucht, die mitgelieferte Hilfe zu sehen, aber es hat mir nicht viel geholfen, da sie für C ++ und Java ähnlich war) .
Zitieren Andrey Pavlenko:
%Vor%MatOfXxx-Klassen (z. B. MatOfPoint) wurden eingeführt, um Redundanz zu vermeiden Kopieren von Zwischendaten zwischen Java und nativem Speicher. Z.B. Sie kann eine große Anzahl von Punkten als Ergebnis einer OpenCV-Funktion erhalten und dann übergebe es an einen anderen.
In C ++ verwenden wir std :: vector dafür. Aber die Verwendung von ArrayList in Java verursacht Kopieren aller Points-Daten von der nativen OpenCV-Ebene nach Java, wenn diese Punkte zurückgeben und sie beim nächsten Aufruf zurückkopieren OpenCV-Funktion mit ihnen. Aus Gründen der Effizienz haben wir gewechselt in solchen Fällen die MatOfPoint-Klasse zu verwenden, die eine Art Mat von 1n ist oder n1 Dimensionen, die einen Punkt in jedem Element (d. h. vom Typ CV_32SC2 oder CV_64FC2).
Wie Sie vielleicht wissen, speichert Mat alle Daten native Ebene, sodass solche Objekte zwischen OpenCV-Aufrufen übergeben werden können ohne Datenkopie. Aber wenn Sie in Ihrem Java-Code irgendwann brauchen Direkter Zugriff auf aktuelle Points-Daten gibt es zuArray () und fromArray Methoden zur expliziten Übertragung von Daten nach / von Java.
Zum Beispiel, um ein MatOfPoint2f zu erstellen enthält die Punkte, die denen aus bestehenden entsprechen MatOfKeyPoint benötigen Sie:
- lädt KeyPoints über MatOfKeyPoint.toArray ()
nach Java- iteriere durch KeyPoint [] und erstelle einen entsprechenden Point [] (alle von cv :: Point, cv :: Point2f und cv :: Point2d werden als dargestellt org.opencv.core.Point in Java)
- Verwenden Sie MatOfPoint2f.fromArray () oder c-tor MatOfPoint2f (Point ... pa), um Ihre Punkte auf native Ebene zu bringen
Wie für die C ++ vs Java-Typen Korrespondenz: