OpenCV3 一个窗口显示多个图片的实现函数

最近新学图像处理以及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);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值