2011-09-28 695 views
21

我试图使用OpenCV 2.1将两张图片合并为一张,两张图片彼此相邻。在Python,我做:将两张图片与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() 

两个输入图像是:

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

产生的图像是:

enter image description here

它可能很难d从场地的其余部分熄灭,但大部分图像是白色的,对应于各个图像应该在哪里。黑色区域是没有图像数据写入的地方。

为什么我的所有图像数据都被转换为白色?

+0

你见过[find_obj.py样品(https://code.ros.org/trac/opencv/browser/trunk/opencv/ samples/python2/find_obj.py)来自OpenCV 2.3.1?它看起来和你想要做的一模一样。 –

+0

@Andrey,是的,这正是我试图转换为OpenCV 2.1的原因。我没有2.3并且无法编译,所以我现在正在使用2.1。 – Cerin

+0

您也可以创建一个关于编译问题的问题。我认为这是可以解决的。请注意,此示例的flann部分不能用OpenCV 2.1实现,因为flann索引的python绑定仅在2.3.1中添加。 –

回答

46

因为你的图片恰好是相同的尺寸(这是用于显示图像的处理结果的常见的情况)的情况下,你可以使用numpy的的串连简化您的代码。

要垂直堆叠(超过IMG2 IMG1):

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

要水平堆叠(IMG1到IMG2的左侧):

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

要验证:

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

垂直和水平的代码是一样的吗? – Dave

+2

我修复了复制粘贴错误。水平方向沿轴1.您可以轻松地自行尝试。我在回复中添加了验证码。 –

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

,或者如果你更喜欢传统的方式:

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似乎在OpenCV 2.3中不存在。此外,您还可以读取灰度图像,然后将它们转换回RGB。所以你的结果会不会是灰度的呢? – dmorlock

+2

我们可以为彩色图像做这个吗? – Krish

7

对于那些正在寻求将2 彩色图像合并为一个, 这是安德烈的答案,为我工作稍有国防部:

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

谢谢...这为我工作奇迹! – Cypher

相关问题