opencv中使用一个窗口显示多张图像,可以采用拼接的方式:将要显示的图像们拼接到一张大图上,在python中可以很方便实现。
python代码如下:
注意输入的imglist中图像尺寸要一致,通道数可以不一致,都会转换成BGR格式
def cv2showimgs(scale, imglist, order):
"""
:param scale: float 原图缩放的尺度
:param imglist: list 待显示的图像序列
:param order: list or tuble 显示顺序 行×列
:return: 返回拼接好的numpy数组
"""
allimgs = imglist.copy()
for i, img in enumerate(allimgs):
if np.ndim(img) == 2:
allimgs[i] = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
allimgs[i] = cv2.resize(img, dsize=(0, 0), fx=scale, fy=scale)
w, h = allimgs[0].shape[1], allimgs[0].shape[0]
# 将待显示图片拼接起来
sub = int(order[0] * order[1] - len(imglist))
# 判断输入的显示格式与待显示图像数量的大小关系
if sub > 0:
for s in range(sub):
allimgs.append(np.zeros_like(allimgs[0]))
elif sub < 0:
allimgs = allimgs[:sub]
imgblank = np.zeros((h * order[0], w * order[1], 3), np.uint8)
for i in range(order[0]):
for j in range(order[1]):
imgblank[i * h:(i + 1) * h, j * w:(j + 1) * w, :] = allimgs[i * order[1] + j]
return imgblank
函数测试
root = "**图片根目录**"
os.chdir(root)
imgfiles = os.listdir(root)
imgs = []
for i in range(4):
img = cv2.imread(imgfiles[i], 1)
imgs.append(img)
show = cv2showimgs(scale=0.6, imglist=imgs, order=(2,2))
# cv2.namedWindow('1', flags=cv2.WINDOW_NORMAL)
cv2.imshow('1', show)
cv2.waitKey(0)
2×2、1×4显示的结果图如下: