使用 OpenCV 组合两个图像

问题描述

我正在尝试使用 OpenCV 2.1 将两个图像合二为一,两个图像彼此相邻放置.在 Python 中,我正在做:

I'm trying to use OpenCV 2.1 to combine two images into one, with the two images placed adjacent to each other. In Python, I'm doing:

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

生成的图像是:

可能很难与网站的其他部分区分开来,但大部分图像都是白色的,对应于单个图像应该在的位置.黑色区域是没有写入图像数据的地方.

It may be hard to distinguish from the rest of the site, but most of the image is white, corresponding to where the individual images should be. The black area is where no image data was written.

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

Why is all my image data being converted to white?


解决方案

对于你的图片恰好大小相同的情况(这是显示图片处理结果的常见情况),你可以使用 numpy 的 concatenate 来简化你的代码.

For cases where your images happen to be the same size (which is a common case for displaying image processing results), you can use numpy's concatenate to simplify your code.

垂直堆叠(img1 over img2):

To stack vertically (img1 over img2):

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

水平堆叠(img1在img2的左边):

To stack horizontally (img1 to the left of img2):

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

验证:

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.

The out.png image will contain img1 on the left and img2 on the right.

相关文章