2013-01-29 14 views
7

Jak połączyć dwie macierze w jedną macierz? Wynikowa macierz powinna mieć taką samą wysokość jak dwie macierze wejściowe, a jej szerokość będzie równa sumie szerokości dwóch macierzy wejściowych.Jak połączyć dwie macierze w Python OpenCV?

szukam istniejącym wcześniej metody, która będzie wykonywać równowartość ten kod:

def concatenate(mat0, mat1): 
    # Assume that mat0 and mat1 have the same height 
    res = cv.CreateMat(mat0.height, mat0.width + mat1.width, mat0.type) 
    for x in xrange(res.height): 
     for y in xrange(mat0.width): 
      cv.Set2D(res, x, y, mat0[x, y]) 
     for y in xrange(mat1.width): 
      cv.Set2D(res, x, y + mat0.width, mat1[x, y]) 
    return res 
+0

Jeśli pracujesz z macierzami, powinieneś używać 'cv2'. Jego wbudowana obsługa tablic "numpy' sprawia, że ​​tego rodzaju pytania są jednoosobowe. – casper

Odpowiedz

9

Jeśli używasz CV2 (dostaniesz wsparcie NumPy wtedy), można użyć funkcji NumPy np.hstack((img1,img2)) aby to zrobić.

np

import cv2 
import numpy as np 

# Load two images of same size 
img1 = cv2.imread('img1.jpg') 
img2 = cv2.imread('img2.jpg') 

both = np.hstack((img1,img2)) 
3

Należy użyć cv2. Legacy używa cvmat. Ale numpy tablice są naprawdę łatwe w obsłudze.

Zgodnie z sugestią użytkownika @abid-rahman-k można użyć hstack (o czym nie wiedziałem), więc użyłem tego.

h1, w1 = img.shape[:2] 
h2, w2 = img1.shape[:2] 
nWidth = w1+w2 
nHeight = max(h1, h2) 
hdif = (h1-h2)/2 
newimg = np.zeros((nHeight, nWidth, 3), np.uint8) 
newimg[hdif:hdif+h2, :w2] = img1 
newimg[:h1, w2:w1+w2] = img 

Ale jeśli chcesz pracować z kodem Legacy, powinno to pomóc

Załóżmy, że wysokość img0 jest większa niż wysokość obrazu

nW = img0.width+image.width 
nH = img0.height 
newCanvas = cv.CreateImage((nW,nH), cv.IPL_DEPTH_8U, 3) 
cv.SetZero(newCanvas) 
yc = (img0.height-image.height)/2 
cv.SetImageROI(newCanvas,(0,yc,image.width,image.height)) 
cv.Copy(image, newCanvas) 
cv.ResetImageROI(newCanvas) 
cv.SetImageROI(newCanvas,(image.width,0,img0.width,img0.height)) 
cv.Copy(img0,newCanvas) 
cv.ResetImageROI(newCanvas) 
1

Wiem, że to pytanie jest stary, ale natknąłem się na to, ponieważ szukałem połączenia tablic, które są dwoma wymiarami (nie tylko łączą się w 1 wymiarze).

np.hstack nie zrobi tego.

Zakładając, że masz dwa obrazy 640x480, które są po prostu dwoma wymiarami, użyj dstack.

a = cv2.imread('imgA.jpg') 
b = cv2.imread('imgB.jpg') 

a.shape   # prints (480,640) 
b.shape   # prints (480,640) 

imgBoth = np.dstack((a,b)) 
imgBoth.shape  # prints (480,640,2) 

imgBothH = np.hstack((a,b)) 
imgBothH.shape  # prints (480,1280) 
        # = not what I wanted, first dimension not preserverd 
+0

Myślę, że powinno to być nowe pytanie, na które można odpowiedzieć, ponieważ ta odpowiedź nie jest związana z pierwotnym pytaniem – VMAtm

Powiązane problemy