Verwechslung zwischen OpenCv4Android- und C ++ - Datentypen

8

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.

  • Point2f (in C ++) - MatOfPoint2f (in Java)
  • Point3f (in C ++) - MatOfPoint3f (in Java)
  • Point2 (in Java)
  • Point3 (in Java)

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) .

    
Utkarsh Mankad 09.04.2013, 04:55
quelle

1 Antwort

5

Zitieren Andrey Pavlenko:

  

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:

%Vor%     
Rui Marques 21.02.2014, 21:52
quelle

Tags und Links