2013-04-09 19 views
8

Sto provando a scrivere alcune applicazioni utilizzando OpenCv4Android per dispositivi Android. In precedenza, stavo usando i codici nativi Android NDK e C++. Ma quella tecnica non era molto lucida. Così sono passato all'ultima API Java che accompagna la versione 2.4.4 di OpenCv.Confusione tra i tipi di dati OpenCv4Android e C++

Sono stato in grado di scrivere programmi semplici ed eseguire campioni. Ma, mentre provavo a scrivere alcuni codici per problemi avanzati come: stima del modello POSE, routine di calibrazione della videocamera ecc., Mi sono imbattuto in questa strana confusione. Alcuni dei tipi di dati i cui nomi sono molto intuitivi nell'API C++ non si adattano perfettamente alla loro controparte Java. Quindi, sto affrontando una terribile difficoltà nel trasferire le mie funzionalità da C++ a Java. Sto affrontando totale confusione in queste funzioni

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

Si prega di aiutarmi a capire i termini utilizzati in OpenCv Java e la sua analogia con C++.

Inoltre, per favore mi suggeriscono qualche riferimento in cui, sono date chiare e nitide descrizione di questi termini (ho provato a guardare l'aiuto fornito insieme, ma non mi ha aiutato molto, come è stato in qualche modo simile sia per il C++ e Java).

+1

Ho chiesto la stessa domanda sul forum ufficiale OpenCv. Ed è stato risposto nel modo seguente. Si prega di fare riferimento al collegamento - [Confusione tra i tipi di dati OpenCv4Android e C++] (http://answers.opencv.org/question/11021/confusion-between-opencv4android-and-c-data-types/) –

+2

Suggerisco per riferimenti futuri , inserisci la risposta con il link e accettala. In questo modo, la domanda verrà rimossa dalla lista senza risposta e altri troveranno la risposta. – Mahm00d

risposta

5

Citando Andrey Pavlenko:

classi MatOfXxx (ad esempio MatOfPoint) sono stati introdotti per evitare ridondante copia di dati intermedi tra Java e memoria nativo. Per esempio. Si può ottenere un numero elevato di punti come risultato di una funzione OpenCV e quindi passarla a un'altra.

In C++ usiamo std :: vector per questo. Tuttavia, l'uso di ArrayList in Java ha causato la copia di copiando tutti i dati Points dal livello OpenCV nativo a Java quando restituisce questi punti e li copia nuovamente quando chiama la successiva funzione OpenCV che li utilizza. Quindi, per ragioni di efficienza, abbiamo utilizzato per utilizzare la classe MatOfPoint in questi casi che è un tipo di Mat di 1n o n1 dimensioni che mantiene un Punto in ciascun elemento (ad esempio di tipo CV_32SC2 o CV_64FC2).

Come forse sapete, Mat conserva tutti i dati sul livello nativo , quindi è possibile passare tali oggetti tra le chiamate OpenCV senza copiare i dati. Ma se nel tuo codice Java a un certo punto hai bisogno dell'accesso diretto a ai dati dei Punti effettivi, ci sono i metodi toArray() e fromArray per trasferire esplicitamente i dati a/da Java.

Ad esempio, per creare un MatOfPoint2f contenente i punti corrispondenti a quelli da esistente MatOfKeyPoint è necessario:

  • punti chiave di carico a Java tramite MatOfKeyPoint.toArray()
  • Scorrere KeyPoint [] e crea un Punto corrispondente [] (tutti cv :: Point, cv :: Point2f e cv :: Point2d sono rappresentati come org.opencv.core.Punto in Java)
  • uso MatOfPoint2f.fromArray() o c-tor MatOfPoint2f (Point ... pa) per mettere i tuoi punti per livello nativo

Per quanto riguarda il C++ vs Java tipi corrispondenza:

vector<Point> : MatOfPoint 
vector<Point2f> : MatOfPoint2f 
vector<Point3i> : MatOfPoint3 
vector<Point3f> : MatOfPoint3f 
vector<KeyPoint> : MatOfKeyPoint 
vector<DMatch> : MatOfDMatch 
vector<Rect>  : MatOfRect 
vector<uchar> : MatOfByte 
vector<char>  : MatOfByte 
vector<int>  : MatOfInt 
vector<float> : MatOfFloat 
vector<double> : MatOfDouble 
vector<Vec4i> : MatOfInt4 
vector<Vec4f> : MatOfFloat4 
+0

ha postato questa risposta di Andrey Pavlenko da un altro forum. Questa è una domanda importante per chi sta iniziando con OpenCV Java che non ha avuto una risposta qui in SO. Ho impostato la risposta come "wiki della comunità", quindi non riceverò la reputazione da questo. –

Problemi correlati