descargar - En OpenCV 2.1: ¿cómo asignar una matriz a una submatriz de otra matriz?
opencv for windows download (4)
Respuesta revisada
Creo que el motivo de su primer método
A(cv::Rect_<int>(0,0,2,2)) = B
no funciona es porque el operador de asignación =
no copia los valores sino que modifica el encabezado de una matriz para apuntar a una submatriz de otro. Por lo tanto, todo lo que esta línea hace es crear una matriz de encabezado temporal apuntando a la submatriz de A, y luego reemplazar el encabezado de esa matriz temporal para apuntar a B. Y luego olvidarse de eso. Los datos en A y B permanecen sin cambios.
Lo que quiere (aunque no lo he probado) es
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
Supongamos que tengo una matriz
A = cv::Mat(3,3,CV_32F)
y una matriz
B = cv::Mat(2,2,CV_32F).
Digamos que A tiene todos los ceros y B tiene todos los ceros. Quiero asignar los valores de B a la esquina superior izquierda de A. ¿Cómo puedo hacer esto?
Intenté lo siguiente:
A(cv::Rect_<int>(0,0,2,2)) = B
Pero esto no parece funcionar. Sin embargo, asignar un valor escalar a la subrect de A de esta manera funciona:
A(cv::Rect_<int>(0,0,2,2)) = 1.0
¿Qué pasa con el primer enfoque?
No tengas miedo de trabajar con punteros
const unsigned int row_size = col_size = 3;
Mat A = Mat::one( row_size, col_size, CV_32F );
Mat B = Mat::zeros( row_size, col_size, CV_32F );
for(int i = 0; i < row_size; i++)
{
float* Aitt = A.ptr<float>(i);
float* Bitt = B.ptr<float>(i);
for(int j = 0; j < ( col_size - i ); ++j)
Aitt[j] = Bitt[j];
}
¿Qué pasa con el primer enfoque?
Para muchos tiempos de Matlab
Preferiría un trazador de líneas, pero este es el truco:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
Puedes hacer esto en una línea con:
B = A(cv::Rect(0,0,2,2)).clone();