Algebra Lineal con OpenCV
Opencv nos brinda apoyo a la hora de realizar cálculos matemáticos, pues ya cuenta con varias funciones pre construidas que nos serán de gran ayuda a la hora de realizar nuestros proyectos de computación visual, vamos a ver algunas de estas funciones principalmente las que nos permiten trabajar con las matrices opencv.
cv::Mat soporta las operaciones básicas como +, –, *, / por lo que podemos realizar estas y otras operaciones sin mucho problema, veamos un ejemplo de como calcular la suma, resta, multiplicación y división de matrices, además mostramos los métodos para calcular la matriz inversa, traspuesta y el determinante.
float a[3][3] = { { 2, 0, 1 }, { 3, 0, 0 }, { 5, 1, 1 } }; float b[3][3] = { { 1, 0, 1 }, { 1, 2, 1 }, { 1, 1, 0 } }; Mat A(3, 3, CV_32FC1, a); Mat B(3, 3, CV_32FC1, b); cout << "A + B" << endl << A + B << endl << endl; cout << "A - B" << endl << A - B << endl << endl; cout << "A * B" << endl << A * B << endl << endl; cout << "A / B" << endl << A / B << endl << endl; cout << "Determinante A = " << determinant(A) << endl << endl; cout << "Traspuesta A = " << endl << A.t() << endl << endl; cout << "Inversa A = " << endl << A.inv() << endl << endl;
si deseamos realizar multiplicación de matrices elemento por elemento usamos el método mul() de cv::Mat.
Resolver sistemas de n ecuaciones
OpenCV también cuenta con el método solve() que nos permite resolver un sistema de ecuaciones algebraicas, debemos crear dos matrices la primera contendrá todos los coeficientes de las distintas ecuaciones que estén del lado izquierdo del =, la segunda matriz contendrá todos los valores a la derecha del =, de este modo:
float c[3][3] = { { 3, 2, 1}, { 5, 3, 4}, { 1, 1,-1} }; float d[3][1] = { { 1 }, { 2 }, { 1 } }; Mat C = Mat(3, 3, CV_32FC1, c); Mat D = Mat(3, 1, CV_32FC1, d); Mat R; solve(C, D, R); cout << "Sitema de 3 Ecuaciones: " << endl << R << endl << endl;
El objeto cv::Mat R contiene las soluciones del sistema de ecuaciones, para este ejemplo el primer valor corresponde a X, el segundo a Y y el ultimo a Z, el tamaño de R dependerá del tamaño del sistema de ecuaciones.
Raíces de un polinomio
Podemos usar la función SolvePoly() de opencv para calcular los n valores que anulan un polinomio de orden n. Podemos buscar tanto raíces reales como complejas con parte real e imaginaria. Veamos un ejemplo:
float p[4] = { 6, 1, -4, 1 }; Mat P(1, 4, CV_32FC1, p); Mat RT; solvePoly(P, RT);
Debemos prestar atención al orden como introducimos los coeficientes, RT contendrá las raíces del polinomio en una matriz donde la primera columna representa la parte real y la segundo la parte imaginaria.
Comentarios
Publicar un comentario