Opencv图像识别从零到精通(11)---一个窗口多图显示

前面介绍了如何批量的读取图片,从而也会有批量的显示一堆图片,那么在平时我们显示图片的时候,会发现都是一个图片一个窗口,会出来很多,这时候就会想到matlab中我们经常会使用subplot显示多张图片在一个窗口,之前http://blog.csdn.net/qq_20823641/article/details/51910066这篇文章也提供了一种方法,可以参考一下,经过进一步学习,从简单到复杂,再一次认为subplot(),感觉越来越有意思,虽然不是最好的,但是是入门比较好的,其中很多部分都可以进行优化,以后会在精通部分进行展示,这里已入门为主。

一、版本1

<span style="font-size:18px;">int main(void)
{
	vector<Mat> imgs(2);
	imgs[0] = imread("cm.png");
	imgs[1] = imread("cm.png");
	Mat dispImg;
	int x, y;
	x = imgs[0].cols;
    y = imgs[0].rows;
	int max;
	max = (x > y)? x: y;
	int dstsize=max;
	dispImg.create(Size(dstsize*(1+1)+100,dstsize), CV_8UC3);
	int nImg = (int)imgs.size();
	for(int i=0;i<nImg;i++)
	{

	    int m=20+i*max;
	    int n=20;
        Mat imgROI = dispImg(Rect(m, n, (int)x, (int)y));
	    resize(imgs[i], imgROI, Size((int)x, (int)y));

	}
      namedWindow("winName");
      imshow("winName", dispImg);
      waitKey();
      return 0;
}</span>

二、版本2

<span style="font-size:18px;">int main(void)
{
	vector<Mat> imgs(6);
	imgs[0] = imread("cm.png");
	imgs[1] = imread("cm.png");
	imgs[2] = imread("lina.png");
	imgs[3] = imread("dr.png");
	imgs[4] = imread("pom.png");
	imgs[5] = imread("qop.png");

	imshowMany("DOTA2_Hero", imgs);
	waitKey();
	return 0;
}

void imshowMany(const std::string& _winName, const vector<Mat>& _imgs)
{
	int nImg = (int)_imgs.size();

	Mat dispImg;

	int size;
	int x, y;

	// w - Maximum number of images in a row
	// h - Maximum number of images in a column
	int w, h;
	// scale - How much we have to resize the image
	float scale;
	int max;

	if (nImg <= 0)
	{
		printf("Number of arguments too small....\n");
		return;
	}
	else if (nImg > 12)
	{
		printf("Number of arguments too large....\n");
		return;
	}

	else if (nImg == 1)
	{
		w = h = 1;
		size = 300;
	}
	else if (nImg == 2)
	{
		w = 2; h = 1;
		size = 300;
	}
	else if (nImg == 3 || nImg == 4)
	{
		w = 2; h = 2;
		size = 300;
	}
	else if (nImg == 5 || nImg == 6)
	{
		w = 3; h = 2;
		size = 200;
	}
	else if (nImg == 7 || nImg == 8)
	{
		w = 4; h = 2;
		size = 200;
	}
	else
	{
		w = 4; h = 3;
		size = 150;
	}

	dispImg.create(Size(100 + size*w, 60 + size*h), CV_8UC3);

	for (int i= 0, m=20, n=20; i<nImg; i++, m+=(20+size))
	{
		x = _imgs[i].cols;
		y = _imgs[i].rows;

		max = (x > y)? x: y;
		scale = (float) ( (float) max / size );

		if (i%w==0 && m!=20)
		{
			m = 20;
			n += 20+size;
		}

		Mat imgROI = dispImg(Rect(m, n, (int)(x/scale), (int)(y/scale)));
		resize(_imgs[i], imgROI, Size((int)(x/scale), (int)(y/scale)));
	}

	namedWindow(_winName);
	imshow(_winName, dispImg);
}</span>

http://blog.csdn.net/yang_xian521/article/details/7915396

http://kanwoerzi.iteye.com/blog/1304073

三、Matlab辅助

matlab就一个subplot()就搞定了,参考这个最后给出了matlab的代码和图片http://blog.csdn.net/qq_20823641/article/details/51910066

时间: 2024-08-09 10:18:09

Opencv图像识别从零到精通(11)---一个窗口多图显示的相关文章

Opencv图像识别从零到精通(30)---重映射,仿射变换

一.序言 面对图像处理的时候,我们会旋转缩放图像,例如前面所提高的resize 插值改变,也是几何变换: 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标.这时就需要灰度级差值将映射的新坐标匹配到输出像素之间.最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿.这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值. 除了插值算法感觉只要了解就可以了,图像处理中比较需要理

Opencv图像识别从零到精通(9)----对比度亮度改变

一张图像来说,会有不同的亮暗程度,很多时候都要增强一下,增强的方法有很多,从大量可以说是线性变换和非线性变换,当然这是说空间域的,频率域的暂时不考虑. 线性变换增强,也是对点的操作,如下图 一.点操作,线性增强 两种常用的点过程(即点算子),是用常数对点进行 乘法 和 加法 运算: 两个参数  和  一般称作 增益 和 偏置 参数.我们往往用这两个参数来分别控制 对比度 和 亮度 . 你可以把  看成源图像像素,把  看成输出图像像素.这样一来,上面的式子就能写得更清楚些: 其中,  和  表示

Opencv图像识别从零到精通(26)---分水岭

分水岭是区域分割三个方法的最后一个,对于前景背景的分割有不错的效果. 分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭.分水岭的概念和形成可以通过模拟浸入过程来说明.在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭. 分水岭

Opencv图像识别从零到精通(32)----直方图对比,模版匹配,方向投影

0.预备知识 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内. 函数原型: <span style="font-size:18px;">void normalize(InputArray src,OutputArray dst, double alpha=1,doublebeta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() ) </span>

Opencv图像识别从零到精通(13)----点线圆矩形与鼠标事件

图像中不可少的元素就是点.线.圆.椭圆.矩形,多边形,同时这些也是物体的特征组成单位,在图像识别中必不可少.所以要首先去认识这个元素怎么定义和使用,同时鼠标是电脑的窗口,我们很多的处理都会用到鼠标.本文主要有下面三个部分: (1) 点.线.圆.椭圆.矩形的基础应用 (2)点.线.圆.椭圆.矩形的进阶应用 (3)鼠标事件 一.点.线.圆.椭圆.矩形的基础应用 绘制点的函数: Point a = Point (600,600); 文字函数putText()函数 void putText( CvArr

Opencv图像识别从零到精通(29)-----图像金字塔,向上上下采样,resize插值

金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似.我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低 一.两个金字塔 高斯金字塔(Gaussianpyramid): 用来向下采样,主要的图像金字塔 拉普拉斯金字塔(Laplacianpyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用. 高斯金字塔不同(DoG)又称为拉普拉斯金字塔,给出计算方式前,先加强一下定义 记得在上面我

Opencv图像识别从零到精通(33)----moravec角点、harris角点

一.角点 图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <1>边缘                   

Opencv图像识别从零到精通(7)----图像平移、旋转、镜像

根据vc6.0c++的学习经验,如果可以很好的自己编程,让图像进行平移旋转这些操作,那么就好像能够清楚的看见图像的内部结构当然这里你怎么访问像素,这个可以自己选一种适合的,最多的是ptr指针,at也是挺多的.看着很简单的变换,可以对图像处理上手的更快,当然对于旋转可能就稍微i难了一点,不过opencv提供了resize(0,remap()等这样的函数,可以方便的让我们进行学习-特别是旋转的时候,有很多的变换,你可以任意旋转一个角度,也可能一直旋转,当然还可以保持图像大小不变的旋转和大小变换的旋转

Opencv图像识别从零到精通(24)------漫水填充,种子填充,区域生长、孔洞填充

可以说从这篇文章开始,就结束了图像识别的入门基础,来到了第二阶段的学习.在平时处理二值图像的时候,除了要进行形态学的一些操作,还有有上一节讲到的轮廓连通区域的面积周长标记等,还有一个最常见的就是孔洞的填充,opencv这里成为漫水填充,其实也可以叫种子填充,或者区域生长,基本的原理是一样的,但是应用的时候需要注意一下,种子填充用递归的办法,回溯算法,漫水填充使用堆栈,提高效率,同时还提供了一种方式是扫描行.经常用来填充孔洞,现在来具体看看. 漫水填充:也就是用一定颜色填充联通区域,通过设置可连通