2012-06-13 21 views
5

Tengo un par de imágenes en Mat todos los objetos con las mismas dimensiones me gustaría crear una bix cv::Mat objeto para contener a todosConcatenate Mat en OpenCV

Así que la dimensión de la nueva matriz es: widthNew = anchoOld x número de matrices, la altura permanece sin cambios.

me encontré con que dicha copia se podría hacer usando:

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL) 

pero entonces, ¿cómo podría la máscara puede definir en tres ocasiones diferentes para las tres matrices ?.

Saludos, Moataz

+0

Tenga cuidado de que el tamaño máximo para una imagen Ipl sea alrededor de 4000 * 4000. También es posible que deba reducir la resolución de su imagen de entrada – jlengrand

+0

La máscara es opcional, no necesita definir una. –

+0

bien. Voy a poner eso en mente, thnx –

Respuesta

5

utiliza un retorno de la inversión para definir una imagen que en realidad es una región de la imagen de destino y luego copiarlos a eso. ver Copy an cv::Mat inside a ROI of another one

+0

Thnx. Funciona bien –

1

Es posible que desee tomar mira the source code of cvShowManyImages(), que es una función que toma varias imágenes como entrada y los concatena una única imagen de 3 canales en el que se mostrará:

El método utilizado es establezca los ROI de una imagen de tamaño grande y luego cambie el tamaño de y copie las imágenes de entrada en la imagen grande individual.

Si crea una imagen de destino lo suficientemente grande como para contener sus otras imágenes, no tendrá que cambiar su tamaño.

Si desea saber cómo convertir entre IplImage < ->cv::Mat, comprobar this thread.

+0

suena interesante, por ejemplo. Creo que copiaré la idea de implementar algo similar usando pure cv :: Mat en lugar de IpImage –

2

Creo que hay una manera fácil de hacerlo. OpenCV tiene un método no documentado llamado hconcat() y vconcat(). El primero es para la concatenación horizontal y el segundo para la concatenación vertical.

Puede utilizarlos de esta manera:

Mat A, B; 
... //In this part you initialize the Mat A and Mat B. 

Mat H, V; //These are the destination matrices 
hconcat(A, B, H); 
vconcat(A, B, V); 

Espero que esto puede ayudar.

+0

El destino puede ser el mismo que uno de los orígenes, por lo que 'vconcat (out, out1, out); vconcat (out, out2, out); 'funcionó bien para mí en un contexto multiproceso (para combinar salida de hilos individuales). – Izaan

Cuestiones relacionadas