webentwicklung-frage-antwort-db.com.de

Zwei Bilder mit OpenCV kombinieren

Ich versuche, OpenCV 2.1 zu verwenden, um zwei Bilder zu einem zu kombinieren, wobei die beiden Bilder nebeneinander platziert werden. In Python mache ich:

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

Die beiden Eingabebilder sind:

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

Das resultierende Bild ist:

enter image description here

Es mag schwierig sein, sich vom Rest der Site zu unterscheiden, aber der größte Teil des Bildes ist weiß, je nachdem, wo sich die einzelnen Bilder befinden sollen. In den schwarzen Bereich wurden keine Bilddaten geschrieben.

Warum werden alle meine Bilddaten in Weiß konvertiert?

48
Cerin

In Fällen, in denen Ihre Bilder die gleiche Größe haben (was bei der Anzeige von Bildverarbeitungsergebnissen häufig der Fall ist), können Sie zur Vereinfachung des Codes die Verknüpfung mit numpy verwenden.

Vertikal stapeln (img1 über img2):

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

Horizontal stapeln (img1 links von img2):

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

Verifizieren:

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

Für diejenigen, die 2 Farbbilder zu einem kombinieren möchten, ist dies eine kleine Modifikation von Andreys Antwort, die für mich funktioniert hat:

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

oder wenn Sie es vorziehen, Legacy-Weg:

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