8

2つの行列を1つの行列に連結するにはどうすればよいですか?結果の行列は、2つの入力行列と同じ高さである必要があり、その幅は2つの入力行列の幅の合計に等しくなります。

このコードと同等の機能を実行する既存のメソッドを探しています。

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
4

3 に答える 3

13

cv2 を使用している場合 (Numpy サポートが得られます)、Numpy 関数np.hstack((img1,img2))を使用してこれを行うことができます。

例:

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))
于 2013-01-29T13:49:52.487 に答える
3

を使用する必要がありますcv2。レガシーはcvmatを使用します。しかし、numpy配列は本当に扱いやすいです。

@ abid-rahman-kが提案しているように、hstack(私は知りませんでした)を使用できるので、これを使用しました。

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

しかし、レガシーコードを使用したい場合は、これが役立つはずです

img0の高さが画像の高さよりも大きいと仮定しましょう

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)
于 2013-01-29T17:05:57.537 に答える
1

この質問は古いことは知っていますが、2次元の配列を連結しようとしていたため(1次元で連結するだけでなく)、偶然見つけました。

np.hstackこれはしません。

640x480単純に 2 つの次元である2 つの画像があると仮定すると、 が使用されます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
于 2014-04-24T14:25:30.913 に答える