奇技淫巧 | OpenCV中如何在一个窗口中显示多张图

科技   2024-10-08 22:58   江苏  

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

来由与思路

最近有人在我B站的 免费视频课程 《OpenCV4 C++ 快速入门视频30讲 》讲后面留言提问:(B站课程地址如下:)

https://www.bilibili.com/video/BV1i54y1m7tw

问我 如何在一个imshow里面显示多个Mat对象/图像?其实这个本质就是一个Mat数据的合并操作。OpenCV读入每张图像都是一个Mat对象,而这些Mat对象本质就是数组,当然可以继续进行数组的合并的,可以把多个Mat对象合并成一个更大的Mat对象,然后传给imshow函数即可显示。

这样就完成了多张图像在同一个窗口显示了。理论上可以创建生成一个grid,每个网络对应一个Mat对象也就是图像,根据需要只要内存够大,可以生成很大的 Grid来实现图像预览。这里就不搞这么复杂,分别以两张图与四张图显示在同一个窗口为例,来说明如何实现多张图的同一窗口显示。

代码实现

首先读入一张图像
Mat image = imread("D:/images/lena.jpg");
imshow("lena", image);

运行结果:

然后完成几种常规简单的处理:
Mat invert, blur, yflip;
// 反色
bitwise_not(image, invert);
// 高斯模糊
GaussianBlur(image, blur, Size(00), 10);
// 镜像
flip(image, yflip, 1);
实现两张图的同一个窗口显示:
// 两张图显示一个窗口
Mat two_view = Mat::zeros(Size(image.cols * 2 + 10, image.rows), image.type());
Rect roi(00, image.cols, image.rows);
image.copyTo(two_view(roi));
roi.x = image.cols + 10;
invert.copyTo(two_view(roi));
imshow("两张图显示", two_view);

实现四张图的同一个窗口显示:
// 四张图显示一个窗口
std::vector<Mat> images;
images.push_back(image);
images.push_back(invert);
images.push_back(yflip);
images.push_back(blur);
int w = image.cols * 2;
int h = image.rows * 2;
Mat result = Mat::zeros(Size(w + 10, h + 10), image.type());
Rect box(00, image.cols, image.rows);
for (int i = 0; i < 4; i++) {
    int row = i / 2;
    int col = i % 2;
    box.x = image.cols * col + 10*col;
    box.y = image.rows * row + 10*row;
    images[i].copyTo(result(box));
}
namedWindow("四张图显示", WINDOW_FREERATIO);
imshow("四张图显示", result);

运行结果如下:


OpenCV4系统化学习


深度学习系统化学习

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

攻略 | 学习深度学习只需要三个月的好方法

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

初学者必看 | 学习深度学习的五个误区


OpenCV学堂
三本书《Java数字图像处理-编程技巧与应用实践》、《OpenCV Android开发实战》、《OpenCV4应用开发-入门、进阶与工程化实践》作者。OpenCV实验大师平台 软件作者,OpenCV开发专家、OpenCV研习社创始人。
 最新文章