2011-09-28 19 views
21

Estoy tratando de usar OpenCV 2.1 para combinar dos imágenes en una, con las dos imágenes colocadas una junto a la otra. En Python, que estoy haciendo:Combinación de dos imágenes con OpenCV

import numpy as np, cv 

img1 = cv.LoadImage(fn1, 0) 
img2 = cv.LoadImage(fn2, 0) 

h1, w1 = img1.height,img1.width 
h2, w2 = img2.height,img2.width 

# Create an array big enough to hold both images next to each other. 
vis = np.zeros((max(h1, h2), w1+w2), np.float32) 

mat1 = cv.CreateMat(img1.height,img1.width, cv.CV_32FC1) 
cv.Convert(img1, mat1) 

mat2 = cv.CreateMat(img2.height, img2.width, cv.CV_32FC1) 
cv.Convert(img2, mat2) 

# Copy both images into the composite image. 
vis[:h1, :w1] = mat1 
vis[:h2, w1:w1+w2] = mat2 

h,w = vis.shape 
vis2 = cv.CreateMat(h, w, cv.CV_32FC3) 
vis0 = cv.fromarray(vis) 
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR) 
cv.ShowImage('test', vis2) 
cv.WaitKey() 

Las dos imágenes de entrada son:

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=2270

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=2270

La imagen resultante es:

enter image description here

Se puede ser difícil de d desaparecer del resto del sitio, pero la mayor parte de la imagen es blanca, correspondiente a donde deberían estar las imágenes individuales. El área negra es donde no se escribieron datos de imagen.

¿Por qué todos mis datos de imagen se convierten a blanco?

+0

¿Usted ha visto [muestra find_obj.py] (https://code.ros.org/trac/opencv/browser/trunk/opencv/ samples/python2/find_obj.py) de OpenCV 2.3.1? Se ve exactamente como lo que estás tratando de hacer. –

+0

@Andrey, sí, eso es lo que intento convertir a OpenCV 2.1. No tengo 2.3 y no puedo compilarlo, así que estoy trabajando con 2.1 por ahora. – Cerin

+0

También puede crear una pregunta sobre su problema de compilación. Creo que es solucionable Y tenga en cuenta que la parte de este ejemplo no puede implementarse con OpenCV 2.1 porque los enlaces de python para el índice de flandes se agregaron solo en 2.3.1. –

Respuesta

46

Para los casos en que sus imágenes resultan ser del mismo tamaño (que es un caso común para mostrar los resultados de procesamiento de imágenes), puede utilizar concatenación de numpy para simplificar tu código

para apilar verticalmente (img1 sobre img2):

vis = np.concatenate((img1, img2), axis=0) 

para apilar horizontalmente (img1 a la izquierda de img2):

vis = np.concatenate((img1, img2), axis=1) 

Para verificar:

import cv2 
import numpy as np 
img = cv2.imread('img.png') 
vis = np.concatenate((img1, img2), axis=1) 
cv2.imwrite('out.png', vis) 
+0

¿El código es el mismo tanto para vertical como horizontal? – Dave

+2

He solucionado el error de copiar y pegar. Horizontalmente se encuentra a lo largo del eje 1. Puede probar esto usted mismo. Agregué código de verificación a la respuesta. –

9
import numpy as np, cv2 

img1 = cv2.imread(fn1, 0) 
img2 = cv2.imread(fn2, 0) 
h1, w1 = img1.shape[:2] 
h2, w2 = img2.shape[:2] 
vis = np.zeros((max(h1, h2), w1+w2), np.uint8) 
vis[:h1, :w1] = img1 
vis[:h2, w1:w1+w2] = img2 
vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR) 

cv2.imshow("test", vis) 
cv2.waitKey() 

o si lo prefiere manera legado:

import numpy as np, cv 

img1 = cv.LoadImage(fn1, 0) 
img2 = cv.LoadImage(fn2, 0) 

h1, w1 = img1.height,img1.width 
h2, w2 = img2.height,img2.width 
vis = np.zeros((max(h1, h2), w1+w2), np.uint8) 
vis[:h1, :w1] = cv.GetMat(img1) 
vis[:h2, w1:w1+w2] = cv.GetMat(img2) 
vis2 = cv.CreateMat(vis.shape[0], vis.shape[1], cv.CV_8UC3) 
cv.CvtColor(cv.fromarray(vis), vis2, cv.CV_GRAY2BGR) 

cv.ShowImage("test", vis2) 
cv.WaitKey() 
+1

cv2.COLOR_GRAY2BGR parece no existir en OpenCV 2.3. Además, lees imágenes en escala de grises y las conviertes luego en RGB. ¿Entonces resultado será grayscaled no es? – dmorlock

+2

¿Podemos hacer esto para imágenes en color? – Krish

7

Para aquellos que buscan combinar 2 imágenes de color en una, esto es un ligero mod sobre la respuesta de Andrei, que trabajó para mí:

img1 = cv2.imread(imageFile1) 
img2 = cv2.imread(imageFile2) 

h1, w1 = img1.shape[:2] 
h2, w2 = img2.shape[:2] 

#create empty matrix 
vis = np.zeros((max(h1, h2), w1+w2,3), np.uint8) 

#combine 2 images 
vis[:h1, :w1,:3] = img1 
vis[:h2, w1:w1+w2,:3] = img2 
+0

Gracias ... ¡Esto funcionó de maravillas para mí! – Cypher