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
- Detección de rostros en Android?
- (OpenCV) no puede encontrar Core.line en Android Studio
- Diferencia entre NativeCameraView y JavaCameraView en OpenCV
- Creación de un paquete de biblioteca de Android que incluye un paquete externo (nativo o Java)
- Substracción de fondo de OpenCV Android
- 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).
- Reducción de la reflexión de luz OpenCV
- Procesamiento de imágenes OpenCV en el servicio de Android
- Pasar una matriz de Mats a código nativo
- No se puede construir caffe en android
- Compilación de Android JNI para OpenCV en Mac OSX
- Uso no libre (SIFT, SURF) en android con java
- Android - Detección de funciones de cara
- OpenCV para Android - inicializar Matrix
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
- URL de la ventana nueva de WebView de Android
- Android: ¿por qué el código nativo es mucho más rápido que el código Java?