首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用OpenCV合并两幅图像

使用OpenCV合并两幅图像
EN

Stack Overflow用户
提问于 2011-09-29 04:11:51
回答 6查看 182.9K关注 0票数 76

我正在尝试使用OpenCV 2.1将两个图像合并为一个,两个图像放置在彼此相邻的位置。在Python中,我要做的是:

代码语言:javascript
复制
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

生成的图像为:

它可能很难与网站的其他部分区分开来,但大部分图像都是白色的,这与单个图像应该位于的位置相对应。黑色区域是未写入图像数据的区域。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-17 02:47:30

对于图像大小相同的情况(这是显示图像处理结果的常见情况),可以使用numpy的连接来简化代码。

要垂直堆叠(img2上的img1),请执行以下操作:

代码语言:javascript
复制
vis = np.concatenate((img1, img2), axis=0)

水平堆叠(img2左侧的img1):

代码语言:javascript
复制
vis = np.concatenate((img1, img2), axis=1)

要验证:

代码语言:javascript
复制
import cv2
import numpy as np
img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.png')
vis = np.concatenate((img1, img2), axis=1)
cv2.imwrite('out.png', vis)

out.png图像将在左侧包含img1,在右侧包含img2。

票数 154
EN

Stack Overflow用户

发布于 2011-09-29 04:44:39

代码语言:javascript
复制
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()

或者,如果您更喜欢使用传统方式:

代码语言:javascript
复制
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()
票数 19
EN

Stack Overflow用户

发布于 2020-05-13 05:09:07

你也可以使用OpenCV内置的函数cv2.hconcatcv2.vconcat,顾名思义,这两个函数分别用于水平和垂直连接图像。

代码语言:javascript
复制
import cv2

img1 = cv2.imread('opencv/lena.jpg')
img2 = cv2.imread('opencv/baboon.jpg')

v_img = cv2.vconcat([img1, img2])
h_img = cv2.hconcat([img1, img2])

cv2.imshow('Horizontal', h_img)
cv2.imshow('Vertical', v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平连接

垂直连接

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7589012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档