[OpenCV笔记]0.OpenCV中显示多张图像
摘要
本文主要介绍OpenCV中同时显示多张IplImage图像的方法(C++形式的多图显示需要修改,用vector<Mat>可能比较方便),有点类似MATLAB中的subplot,只是暂时还没有subplot那么完善,这种方法主要思想和用到的技术为:
- 主要思想:将多张小图组合成一张大图来显示
- 组合方式:按照图片的数量,将大图分割成特定的行列数,每一个小块放一张子图
- 输入方式:使用 中的 type va_list ,就可定义形参数目不确定的函数了。
1. va_list
- va_start Initialize a variable argument list (macro ) 初始化可变参数列
- va_arg Retrieve next argument (macro ) 读取下一个参数
- va_end End using variable argument list (macro ) 结束可变参数列的使用
下面是va_list的一个应用例子:
void PrintFloats (int n, ...)
{
int i;
double val;
printf ("Printing floats:");
va_list vl;
va_start(vl,n);
for (i=0;i<n;i++)
{
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
va_end(vl);
printf ("\n");
}
2. cvShowMultiImages
程序需要的头文件:
#include <stdio.h> // printf
#include <stdarg.h> // va_list, va_start, va_arg, va_end
#include "cv.h"
#include "opencv2/highgui/highgui_c.h"
主体程序:
void cvShowMultiImages(char* title,int nChannels, int nArgs, ...)
{
IplImage* img; // img - Used for getting the arguments
IplImage* DispImage;// DispImage - the image in which all the input images are to be copied
int size_r,size_c; // size - the size of the images in the window
int ind; // ind - the index of the image shown in the window
int x_c, y_r; // x_c,y_r - the coordinate of top left coner of input images
int w, h; // w,h - the width and height of the image
int r, c; // r - row , c - col
int space_r,space_c;// space - the spacing between images
if(nArgs <= 0) { // If argc < 0 or argc > 12 , return without displaying
printf("Number of arguments too small..../n");
return;
}
else if(nArgs > 12) {
printf("Number of arguments too large..../n");
return;
}
// Determine the size of the image,
// and the number of rows/cols
// from number of arguments
else if (nArgs == 1) {
r = c = 1;
size_r = 480; size_c = 640 ;
}
else if (nArgs == 2) { // x_c = size_row y_r=size_col
r = 1; c = 2;
// size_r = 705; size_c = 350 ; // specail set for show the full story of lena
size_r = 405; size_c = 540 ;
}
else if ( nArgs == 3 || nArgs == 4) {
r = 2; c = 2;
size_r = 405; size_c =540 ;
}
else if (nArgs == 5 || nArgs == 6) {
r = 2; c = 3;
size_r = 360; size_c = 480;
}
else if (nArgs == 7 || nArgs == 8) {
r = 2; c = 4;
size_r = 200; size_c = 240;
}
else {
r = 3; c = 4;
size_r = 150; size_c = 200;
}
// Create a new 3 channel image to show all the input images
// cvSize(width,height)=(col,row)=(y_r,x_c)
DispImage = cvCreateImage( cvSize(30 + size_c*c,40 + size_r*r), IPL_DEPTH_8U, nChannels );
// Used to get the arguments passed
va_list args;
va_start(args, nArgs); // stdarg.h
// Loop for nArgs number of arguments
space_r = 40/(r+1);
space_c = 30/(c+1);
for (ind = 0, x_c = space_c, y_r = space_r; ind < nArgs; ind++, x_c += (space_c + size_c)) {
// Get the Pointer to the IplImage
img = va_arg(args, IplImage*); // stdarg.h
if(img == 0) {// If img == NULL, release the image, and return
printf("Invalid arguments");
cvReleaseImage(&DispImage);
return;
}
// Find the width and height of the image
w = img->width;
h = img->height;
// Used to Align the images
// i.e. Align the image to next row e.g.r=1,c=2, this row is end , we have ind%c==0 ,
// then we move to the next row,even the next row can't through the cond ind < nArgs
if( ind % c == 0 && x_c!= space_c) {
x_c = space_c;
y_r += space_r + size_r;
}
cvSetImageROI(DispImage, cvRect(x_c, y_r, size_c, size_r)); // Set the image ROI to display the current image
cvResize(img, DispImage); // Resize the input image and copy the it to the Single Big Image
cvResetImageROI(DispImage); // Reset the ROI in order to display the next image
}
cvNamedWindow( title, 1 ); // Create a new window, and show the Single Big Image
cvShowImage( title, DispImage);
cvWaitKey(0);
va_end(args); // End the number of arguments
cvReleaseImage(&DispImage); // Release the Image Memory
}
3. 程序调用方式与结果显示
应用时,请注意所有输入的图像都应该为同一个通道数:1或者3
cvShowMultiImages("Lena1",3,2,src1,edges1Color);
cvShowMultiImages("Lena2",3,2,src2,edges2Color);
显示结果为:

好吧,其实me更想展示的是 ———— The Complete Story of Lena :

reference
[OpenCV笔记]0.OpenCV中显示多张图像的更多相关文章
- 【QT】QPixmap和QImage在QLabel显示一张图像
#include <QPixmap> void Dialog::on_Button1_clicked() { QPixmap img; img.load("1.bmp" ...
- Android WebView中显示一张或多张图片
最近需要在平板中显示多张图片,调查了下,决定用WebView(说实话,我还不清楚有没有其他android控件能够显示多张图片的.....), 主要是用HTML的img来显示多张图片. google百度 ...
- openCV—Python(2)—— 载入、显示和保存图像
一.函数简单介绍 1.imread-读取图像 函数原型:imread(filename, flags=None) filename:读取的图像路径名:比如:"H:\img\lena.jpg& ...
- OpenCV基本架构[OpenCV 笔记0]
最近正在系统学习OpenCV,将不定期发布笔记,主要按照毛星云的<OpenCV3编程入门>的顺序学习,会参考官方教程和文档.学习工具是Xcode+CMake,会对书中一部分内容更正,并加入 ...
- OpenCV学习5-----使用Mat合并多张图像
最近做实验需要对比实验结果,需要将几张图片拼在一起,直观对比. 尝试用OpenCV解决. 核心思想其实是 声明一个足够大的,正好容纳下那几张图片的mat,然后将拼图依次copy到大图片相应的位置. ...
- MFC中显示一张位图
1.用类CBitmap加载位图 2.创建内存DC, 将位图选进此内存DC 3.调用BitBlt将内存DC的内容拷贝到其它DC(通知是显示DC) 例子(来自MSDN): // This OnDraw() ...
- 利用python进行简单的图像处理:包括打开,显示以及保存图像
利用python进行简单的图像处理:包括打开,显示以及保存图像 利用PIL处理 PIL(python image library) 是python用于图片处理的package.但目前这个package ...
- 第十七周 - OpenCV 学习笔记 S1 - OpenCV 基本函数
Imread()函数: 基本功能:读取图像到OpenCv中. 1.函数原型: Mat imwrite(const strings& filename, int flag = 1); 第一个参数 ...
- 【笔记】PIL 中的 Image 模块
Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片.例如,以下的脚本先载入一幅图片,将它旋转 45 度角,并显示出来: 1 >>> ...
随机推荐
- PHP爬取知乎日报图片显示不了问题
在爬取知乎日报的内容时,虽然能拿到图片的地址,在窗口中也能打开图片,但是在前端却显示不了,报403错误. 经查证,这是因为知乎对图片做了防盗链处理,其中一个解决方法是添加meta标签: <met ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 解决办法
背景:mysql5.1.36,mybatis 前言:为了解决一对多,分页显示,但是前端主要是显示的一的一方的数据和(多方的某个字段拼接在一起),此时的limit不能直接跟在查询的后面,需要用子查询把需 ...
- git gc内存错误的解决方案
Auto packing the repository for optimum performance. You may alsorun "git gc" manually. Se ...
- Lucene TF-IDF 相关性算分公式
转自: http://lutaf.com/210.htm Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF- ...
- DataStage系列教程 (Change Capture)
Change Capture可以比较具有相同列的数据集的差异,得出一个数据集(After)在另一个数据库(Before)的基础上产生的哪些变化.变化类型如表1: 变化代码 变化 中文说明 0 no c ...
- Adobe HTTP Dynamic Streaming (HDS) manifest 文件 f4m bootstrap属性解析
首先介绍一下应用背景,我们使用的很多浏览器都依赖Adobe Flash Player 播放视频文件.Flash Player是一个播放的客户端,客户端和服务端之间的流通信有几套实现的标准.包括这里介绍 ...
- QT 样式表实例
目标:实现button的圆角效果及背景颜色,鼠标滑过颜色变亮,鼠标点击颜色变重. 总体思路首,先根据需要及样式规则新建.qss文件,然后在代码中将文件引用并应用样式. 具体过程如下: 1在项目当前目录 ...
- emmet常用指令组合
emmet的应用 1.生成html(需要先将文件命名为.html后缀) !+tab,html:5+tab 2.生成meta utf meta:utf+tab 3.生成meta viewpo ...
- webpack入门配置
webpack入门配置 根据该篇文章进行配置: 入门 Webpack,看这篇就够了 其中由于版本更新的问题会出现几个问题: 1.Would you like to install webpack-cl ...
- 【三小时学会Kubernetes!(三) 】Service实践
服务Service Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口.这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示. 图16:Kubernetes 服务 ...