2011-09-28 27 views
21

Próbuję użyć OpenCV 2.1, aby połączyć dwa obrazy w jeden, z dwoma obrazami umieszczonymi obok siebie. W Pythonie, robię:Łączenie dwóch obrazów z 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() 

Oba obrazy są wejściowe:

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

Uzyskany obraz jest:

enter image description here

It może być trudne do d odróżnia się od reszty strony, ale większość obrazu jest biała, co odpowiada miejscu, w którym powinny znajdować się poszczególne obrazy. Czarny obszar to miejsce, w którym nie zapisano danych obrazu.

Dlaczego wszystkie moje dane obrazu są konwertowane na biały?

+0

Widziałeś [find_obj.py próbki] (https://code.ros.org/trac/opencv/browser/trunk/opencv/ samples/python2/find_obj.py) z OpenCV 2.3.1? Wygląda dokładnie tak, jak próbujesz to zrobić. –

+0

@Andrey, tak, właśnie to próbuję przekonwertować na OpenCV 2.1. Nie mam 2.3 i nie mogę go skompilować, więc na razie pracuję z wersją 2.1. – Cerin

+0

Możesz również utworzyć pytanie dotyczące problemu z kompilacją. Myślę, że to rozwiązalne. I proszę zauważyć, że część flann z tego przykładu nie może być zaimplementowana z OpenCV 2.1, ponieważ powiązania Pythona dla indeksu flann zostały dodane tylko w 2.3.1. –

Odpowiedz

46

W przypadkach, gdzie obrazy zdarzają się być tej samej wielkości (co jest częstym przypadku wyświetlania wyników przetwarzania obrazu), można użyć CONCATENATE NumPy za uprościć twój kod.

układanie w pionie (img1 na img2)

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

stos poziomie (img1 z lewej img2)

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

sprawdzenie:

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

Kod jest taki sam dla wersji pionowej i poziomej? – Dave

+2

Naprawiłem błąd kopiowania i wklejania. Poziomo znajduje się wzdłuż osi 1. Możesz łatwo spróbować sam. Dodałem kod weryfikacyjny do odpowiedzi. –

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

lub jeśli wolisz starszych sposób:

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 wydaje się nie istnieć w OpenCV 2.3. Dalej odczytujesz obrazy w skali szarości i następnie je konwertujesz z powrotem do RGB. Więc wynik będzie skalowany, prawda? – dmorlock

+2

Czy możemy to zrobić w przypadku obrazów kolorowych? – Krish

7

uzyskać ci, którzy chcą połączyć 2 kolorowych obrazów w jedną, jest to niewielki mod na odpowiedź Andrey, który pracował dla mnie:

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

Dzięki ... To działało dla mnie cuda! – Cypher