opencv - una - ventajas de usar wordle
Ventajas de cv:: Matx (4)
Esta es una respuesta tardía tardía, ¡pero sigue siendo una pregunta interesante!
La respuesta de dom es bastante precisa, y la referencia de montón / pila en user1460044 también es interesante.
Desde un punto de vista práctico, no usaría Matx
(o Vec
), excepto si fuera completamente necesario. Las principales ventajas de Matx son
- Usando la pila (¡ eficiente ! [1])
- Inicialización
El problema es que al final tendrás que mover tus datos de Matx
a un Mat
para hacer la mayoría de las cosas, y así estarás nuevamente en el montón. Por otro lado, la "inicialización genial" de una Matx
se puede hacer en una Mat normal:
// Matx initialization:
Matx31f A(1.f,2.f,3.f);
// Mat initialization:
Mat B = (Mat_<float>(3,1) << 1.f, 2.f, 3.f);
Además, hay una diferencia en las cosas de inicialización (más allá del montón / montón). Si intenta poner 5 valores en Matx31, se bloqueará (excepción de tiempo de ejecución), mientras que llamar al Mat_::operator<<
con 5 valores solo almacenará los tres primeros.
[1] Eficiente si su programa tiene que crear muchas matrices de menos de ~ 10 elementos. En ese caso, use matrices Matx
.
Noté que se agregó una nueva estructura de datos cv :: Matx a la nueva versión de OpenCV , destinada a pequeñas matrices de tamaño conocido en el momento de la compilación, por ejemplo
cv::Matx31f // matrix 3x1 of float type
Revisando la documentation vi que la mayoría de las operaciones de la matriz están disponibles, pero aún no veo las ventajas de usar este nuevo tipo en lugar del viejo cv :: Mat.
¿Cuándo debería usar Matx en lugar de Mat?
Hay otras 2 razones por las que prefiero Matx
a Mat
:
Legibilidad: las personas que leen el código pueden ver inmediatamente el tamaño de las matrices, por ejemplo:
cv::Matx34d transform = ...;
Está claro que esta es una matriz 3x4, por lo que contiene una transformación 3D de tipo (R, t), donde R es una matriz de rotación (en oposición a decir, eje-ángulo). Del mismo modo, acceder a un elemento es más natural con
transform(i,j)
vstransform.at<double>(i,j)
.Fácil depuración Dado que los elementos para
Matx
se asignan en la pila en una matriz de longitud conocida, los IDE o los depuradores pueden mostrar todos los contenidos de forma agradable al recorrer el código.
Respuesta corta: cv :: Mat usa el montón para almacenar sus datos, mientras que cv :: Matx usa la pila.
Un cv :: Mat utiliza la asignación de memoria dinámica (en el montón). Esto es apropiado para matrices grandes (como imágenes) y le permite hacer cosas como copias superficiales de una matriz, que es el comportamiento predeterminado de cv :: Mat.
Sin embargo, para las matrices pequeñas para las que está diseñado el cv :: Matx, la asignación del montón sería muy costosa en comparación con hacer lo mismo en la pila. He visto un bloque de matemática reducir el tiempo de procesamiento en más del 75% al cambiar al uso de tipos asignados a la pila (por ejemplo, cv :: Point y cv :: Matx) en lugar de cv :: Mat.
Se trata de la gestión de la memoria y no perder memoria (en algunos casos importante) o simplemente reserva de memoria para un objeto que usarás más adelante.
Así es como lo entiendo, puede ser que otra persona pueda dar una mejor explicación.