2013-01-29 43 views
7

Come concatenare due matrici in una matrice? La matrice risultante dovrebbe avere la stessa altezza delle due matrici di input e la sua larghezza corrisponderà alla somma della larghezza delle due matrici di input.Come concatenare due matrici in Python OpenCV?

Sto cercando un metodo preesistente che eseguirà l'equivalente di questo codice:

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

Se si lavora con le matrici, si dovrebbe usare 'cv2'. Il suo supporto integrato per gli array 'numpy' rende questo tipo di domande one-liner. – casper

risposta

9

Se si utilizza CV2, (si otterrà il supporto Numpy poi), è possibile utilizzare la funzione Numpy np.hstack((img1,img2)) per fare questo.

esempio:

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

Si dovrebbe usare cv2. L'eredità utilizza cvmat. Ma gli array numpy sono davvero facili da usare.

Come suggerito da @abid-rahman-k, è possibile utilizzare hstack (di cui non ero a conoscenza) quindi l'ho usato.

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 

Ma se si vuole lavorare con il codice legacy, questo dovrebbe aiutare

Supponiamo che l'altezza di img0 è superiore all'altezza dell'immagine

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

So che questa domanda è vecchia, ma mi sono imbattuto in esso perché stavo cercando di concatenare matrici di due dimensioni (non solo concatenate in 1 dimensione).

np.hstack non lo farà.

Supponendo di avere due 640x480 immagini che sono semplicemente due dimensioni utilizzare 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

Penso che dovrebbe essere una nuova domanda auto-risposta, in quanto questa risposta non è correlata alla domanda originale – VMAtm