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.

Operaciones son matrices 


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:

ecuacion
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:

polinomio
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

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas