微信公众号: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(0, 0), 10);
// 镜像
flip(image, yflip, 1);
// 两张图显示一个窗口
Mat two_view = Mat::zeros(Size(image.cols * 2 + 10, image.rows), image.type());
Rect roi(0, 0, image.cols, image.rows);
image.copyTo(two_view(roi));
roi.x = image.cols + 10;
invert.copyTo(two_view(roi));
imshow("两张图显示", two_view);
// 四张图显示一个窗口
std::vector 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(0, 0, 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.8+YOLOv8对象检测C++推理演示
ZXING+OpenCV打造开源条码检测应用
攻略 | 学习深度学习只需要三个月的好方法
三行代码实现 TensorRT8.6 C++ 深度学习模型部署
实战 | YOLOv8+OpenCV 实现DM码定位检测与解析
对象检测边界框损失 – 从IOU到ProbIOU
初学者必看 | 学习深度学习的五个误区