Confusión entre los tipos de datos OpenCv4Android y C ++

Estoy tratando de escribir algunas aplicaciones que utilizan OpenCv4Android para dispositivos Android. Antes, estaba usando códigos NDK y C ++ de Android. Pero esa técnica no era muy lúcida. Así que cambié a la última API de Java que viene junto con OpenCv versión 2.4.4.

Pude escribir programas sencillos y ejecutar muestras. Pero, mientras intentaba escribir algunos códigos para problemas avanzados como – la estimación del modelo POSE, rutinas de calibración de la cámara etc, me encontré con esta confusión muy extraña. Algunos de los tipos de datos cuyos nombres son muy intuitivos en C ++ API no encajan realmente en su contraparte de Java. Por lo tanto, estoy enfrentando terribles dificultades para poner en puerto mi funcionalidad de C ++ a Java. Estoy enfrentando la confusión total en estas funciones

  • Point2f (en C ++) – MatOfPoint2f (en Java)
  • Point3f (en C ++) – MatOfPoint3f (en Java)
  • Point2 (en Java)
  • Point3 (en Java)

Por favor, ayúdame a entender los términos utilizados en OpenCv Java y su analogía con C ++.

También, por favor sugerirme alguna referencia donde se da una descripción clara y nítida de estos términos (intenté ver la ayuda proporcionada a lo largo, pero no me ayudó mucho, ya que era algo similar para C ++ y Java).

Citando a Andrey Pavlenko:

MatOfXxx clases (por ejemplo, MatOfPoint) se introdujeron para evitar la copia redundante de datos intermedios entre Java y la memoria nativa. Por ejemplo, puede obtener un gran conjunto de puntos como resultado de una función OpenCV y luego pasarla a otra.

En C ++ usamos std :: vector para esto. Pero el uso de ArrayList en Java causó la copia de todos los datos de puntos de nivel OpenCV nativo a Java al devolver estos puntos y copiarlos de nuevo cuando se llama a la siguiente función de OpenCV que los utiliza. Por lo tanto, en aras de la eficiencia cambiamos al uso de la clase MatOfPoint en tales casos que es una clase de Mat de 1n o n1 dimensiones que mantiene un Punto en cada elemento (es decir, del tipo CV_32SC2 o CV_64FC2).

Como sabrás, Mat mantiene todos los datos en el nivel nativo, por lo que estos objetos se pueden pasar entre llamadas OpenCV sin copiar los datos. Pero si en su código Java en algún momento necesita acceso directo a los datos reales de los puntos hay métodos toArray () y fromArray para transferir explícitamente los datos desde / hacia Java.

Por ejemplo, para crear un MatOfPoint2f que contenga los puntos correspondientes a los de MatOfKeyPoint existente, necesita:

  • Cargar KeyPoints a Java a través de MatOfKeyPoint.toArray ()
  • Iterar a través de KeyPoint [] y crear un Punto correspondiente [] (todos de cv :: Point, cv :: Point2f y cv :: Point2d se representan como org.opencv.core.Point en Java)
  • Utilice MatOfPoint2f.fromArray () o c-tor MatOfPoint2f (punto … pa) para poner sus puntos a nivel nativo

En cuanto a la correspondencia entre C ++ y Java types:

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 
  • Android Camera takePicture utiliza Previews small buffer
  • Android no puede cargar la imagen orientada correcta desde la galería
  • OpenCV - Java: función inRange
  • La cámara no está abierta - Inicialización estática en OpenCV Android
  • Android Studio, Gradle, OpenCV y NDK
  • Aplicación de Android que utiliza tecnología de reconocimiento de imagen
  • Reconocimiento de monedas en Android
  • No se encontró el paquete de la biblioteca OpenCV
  • ¿Cómo obtener el nivel de Compensación de exposición de la cámara del teléfono Android, a través de Java, cuando se toma la foto?
  • No se puede vincular la biblioteca nativa en la muestra de Android de OpenCV
  • Error: el paquete android.hardware.camera2 no existe OpenCV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.