web-dev-qa-db-fra.com

Combinaison de deux images avec OpenCV

J'essaie d'utiliser OpenCV 2.1 pour combiner deux images en une seule, les deux images étant adjacentes. En Python, je fais:

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=227

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

L'image résultante est:

enter image description here

Il peut être difficile de faire la distinction avec le reste du site, mais la plupart des images sont en blanc, ce qui correspond au lieu où les images individuelles doivent ê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?

48
Cerin

Dans les cas où vos images ont la même taille (ce qui est courant pour l'affichage des résultats de traitement d'images), vous pouvez utiliser la concaténation de numpy pour simplifier votre code.

Pour empiler verticalement (img1 sur img2):

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

Pour empiler horizontalement (img1 à gauche de img2):

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

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)
93
Matt Liberty

Pour ceux qui cherchent à combiner 2 images couleur en une seule, voici un léger mod de la réponse de 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
18
FacePalm
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 la tradition:

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()
15
Andrey Kamaev