OpenCV单窗口显示多图片

《OpenCV计算机视觉开发实践:基于Python(人工智能技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书

在某些场景下,比如有多个摄像头视频图像,如果一个视频图像显示在一个窗口中,则会因为窗口过多而显得凌乱。此时就需要一个窗口能显示多个视频图像。想要达到这个效果,原理并不复杂,只需要调整每个视频的尺寸大小为窗口的一部分,这样多个图像组合起来正好可以占满一个窗口。

在OpenCV中,我们可以利用hstack函数来实现单窗口显示多幅图像。首先熟悉一下hstack函数。hstack函数就是把两个行相同的数组或者矩阵的列从左到右排列起来,也就是把列水平排列起来,声明如下:

复制代码
numpy.hstack(tup)

其中,tup是ndarrays数组序列。这里说的数组就是NumPy库的array,比如定义了一个3行5列的二维矩阵数组:

复制代码
a=np.array([[ 0,  1,  2,  3,  4],

              [ 5,  6,  7,  8,  9],

              [10, 11, 12, 13, 14]])

print(a.shape)  #输出(3,5)

这里的行数是矩阵的高度,列数是矩阵的宽度。比如建立一个一维矩阵b,长度为b.shape:

复制代码
b =np.array([1,2,3,4]) 

print(b.shape) 

输出是(4,),4就是一维矩阵的长度,因为不存在二维,也就没有二维的长度,因此括号里的逗号后面是空的。

再比如建立4行2列的二维矩阵数组:

复制代码
c =np.array([[1,1],[1,2],[1,3],[1,4]]) 

print(c.shape)

输出是(4,2),shape[0]表示行数,这里是4行,shape[1]表示列数,这里是2列。注意方括号的数量。

有时候方括号也可以用圆括号来表示,比如2行3列的二维矩阵:

复制代码
x = np.array(((1,2,3),(4,5,6)))  #2行3列

print(x.shape)

输出是(2,3)。注意圆括号的数量匹配。

简单复习array基本知识后,我们可以用hstack函数来合并行数相同的矩阵数组,比如合并两个都是1行的一维数组:

复制代码
a = np.array((1,2,3))       #1行3列

b = np.array((4,5,6,7))    #1行4列

e = np.hstack((a,b))

print(e)

输出:

array([1, 2, 3, 4,5,6,7]) #结果依然是1行

又比如合并3个两行的二维数组:

复制代码
a = np.array([[1,2],[3,4]])

b = np.array(((1,2,3),(4,5,6)))  #2行3列

c = np.array(((1,1,1,1),(2,2,2,2)))

e = np.hstack((a,b,c))

print(e)

输出:

复制代码
[[1 2 1 2 3 1 1 1 1]

 [3 4 4 5 6 2 2 2 2]]

了解了hstack函数后,我们可以在一个窗口中显示多幅图片,原理是直接通过imread函数返回的二维矩阵数组传入hstack函数中。

【例3.6】 单窗口中显示多幅图片

复制代码
import cv2 as cv 
import numpy as np #导入numpy模块 
def opecv_muti_pic():
    img1 = cv.imread('1.jpg')
    print(img1.shape)
    img2 = cv.imread('2.jpg')
    print(img2.shape)
    img3 = cv.imread('3.jpg')
    print(img3.shape)
    imgs = np.hstack([img1,img2,img3])
    #展示多个
    cv.imshow("mutil_pic", imgs)
    #等待关闭
    cv.waitKey(0)

opecv_muti_pic()

在上述代码中,首先读取了3幅图片,并各自返回了二维矩阵数组,这3幅图片在工程目录下可以找到,为了节省篇幅,这里不对是否读取成功进行判断,但一线企业开发则不能少这个判断。随后,把3幅图片的矩阵数组传入hstack函数中进行合并,并返回合并后的矩阵数组,然后通过imshow显示出来。我们每次读取一幅图片,就把它的宽度和高度打印出来。可以发现,高度(行数)都是相同的,否则是不能用于hstack的。例如,把图片3缩放后保存,再运行程序,就会报错。

运行工程,结果如图3-7所示。

图3‑7

相关推荐
B博士37 分钟前
科研进展 | JAG: 大光斑高光谱激光雷达遥感辐射传输模型从垂直视角解锁森林叶绿素分布密码
人工智能·jag·高光谱激光雷达·森林分层叶绿素诊断
Yao.Li2 小时前
PVN3D ORT CUDA Custom Ops 实现与联调记录
人工智能·3d·具身智能
诺伦2 小时前
LocalClaw 在智能制造的新机会:6部门AI+电商政策下的工厂AI升级方案
人工智能·制造
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬8 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志8 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114248 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠8 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光8 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好8 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型