for descargar descarga opencv

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();