2011-09-28 6 views
21

J'essaie d'utiliser OpenCV 2.1 pour combiner deux images en une, avec les deux images placées l'une à côté de l'autre. En Python, je suis en train de faire:Combinaison de deux images avec 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() 

Les deux images d'entrée sont:

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

L'image résultante est:

enter image description here

Il peut être difficile à d istinguish du reste du site, mais la plupart de l'image est blanche, correspondant à l'endroit où les images individuelles devraient être. La zone noire est l'endroit où aucune donnée d'image n'a été écrite.

Pourquoi toutes mes données d'image sont-elles converties en blanc?

+0

Avez-vous vu [échantillon find_obj.py] (https://code.ros.org/trac/opencv/browser/trunk/opencv/ samples/python2/find_obj.py) d'OpenCV 2.3.1? Cela ressemble exactement à ce que vous essayez de faire. –

+0

@Andrey, Oui, c'est en fait ce que je suis en train de convertir en OpenCV 2.1. Je n'ai pas 2.3 et je ne peux pas le compiler, donc je travaille avec 2.1 pour le moment. – Cerin

+0

Vous pouvez également créer une question sur votre problème de compilation. Je pense que c'est résoluble. Et notez que la partie flan de cet exemple ne peut pas être implémentée avec OpenCV 2.1 car les bindings python pour flann index ont été ajoutés seulement dans 2.3.1. –

Répondre

46

Pour les cas où vos images se trouvent être la même taille (ce qui est un cas commun pour l'affichage des résultats de traitement d'image), vous pouvez utiliser concatenate de numpy pour simplifier votre code.

pour empiler verticalement (img1 sur img2):

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

pour empiler horizontalement (img1 à la gauche de img2):

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

pour vérifier:

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

Le code est le même pour vertical et horizontal? – Dave

+2

J'ai corrigé l'erreur de copier-coller. Horizontalement est le long de l'axe 1. Vous pouvez facilement l'essayer vous-même. J'ai ajouté le code de vérification à la réponse. –

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

ou si vous préférez façon héritage:

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 semble ne pas exister dans OpenCV 2.3. En outre, vous lisez les images en niveaux de gris et les convertissez ensuite en RVB. Donc, le résultat sera grayscaled n'est-ce pas? – dmorlock

+2

Pouvons-nous le faire pour les images couleur? – Krish

7

Pour ceux qui cherchent à combiner 2 images couleur en un, c'est un petit mod sur la réponse Andrey qui a fonctionné pour moi:

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

Merci ... Cela a fonctionné des merveilles pour moi! – Cypher