最近新学图像处理以及OpenCV3,想要在一个窗口上同时显示处理前后的图片,网上搜索了一下,从下面这个网站上学习了:
http://my.oschina.net/u/1426828/blog/368838
然后自己写了一个简单的实现代码如下。
#include "stdafx.h"
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
/*******************同时显示多张图片*************************
*_winName 为显示窗口的名字字符串;
*_img 为要显示的图片的集合;
*最多同时显示12张图片
*************************************************************/
void imshowMulti(const std::string& _winName, const std::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;
}
switch(nImg)
{
case 1:
w = h = 1;
size = 300;
break;
case 2:
w = 2; h = 1;
size = 300;
break;
case 3:
case 4:
w = 2; h = 2;
size = 300;
break;
break;
case 5:
case 6:
w = 3; h = 2;
size = 200;
break;
case 7:
case 8:
w = 4; h = 2;
size = 200;
break;
default:
w = 4; h = 3;
size = 150;
break;
}
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);
}
void main()
{
vector<Mat> img;
Mat img1 = imread("hua1.jpg");
Mat img2 = imread("hua2.jpg");
Mat img3 = imread("hua3.jpg");
img.push_back(img1);
img.push_back(img2);
img.push_back(img3);
imshowMulti("test", img);
waitKey(0);
}