您的位置:首页 > 其它

在一个窗口中显示多张图片

2016-04-05 20:10 369 查看
忘记了是引用那位大神的了

// showManyImage.cpp : Defines the entry point for the console application.
//

#include<opencv2\opencv.hpp>
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <iostream>

using namespace std;
using namespace cv;

void cvShowManyImages(char* title, int nArgs, ...)
{

// img - Used for getting the arguments
IplImage *img;

// DispImage - the image in which input images are to be copied
IplImage *DispImage;

int size;
int i;
int m, n;
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 the number of arguments is lesser than 0 or greater than 12
// return without displaying
if (nArgs <= 0) {
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) {
w = h = 1;
size = 300;
}
else if (nArgs == 2) {
w = 2; h = 1;
size = 300;
}
else if (nArgs == 3 || nArgs == 4) {
w = 2; h = 2;
size = 300;
}
else if (nArgs == 5 || nArgs == 6) {
w = 3; h = 2;
size = 200;
}
else if (nArgs == 7 || nArgs == 8) {
w = 4; h = 2;
size = 200;
}
else {
w = 4; h = 3;
size = 150;
}

// Create a new 3 channel image0
DispImage = cvCreateImage(cvSize(100 + size*w, 60 + size*h), 8, 3);

// Used to get the arguments passed
va_list args;
va_start(args, nArgs);

// Loop for nArgs number of arguments
for (i = 0, m = 20, n = 20; i < nArgs; i++, m += (20 + size)) {

// Get the Pointer to the IplImage
img = va_arg(args, IplImage*);

// Check whether it is NULL or not
// If it is NULL, release the image, and return
if (img == 0) {
printf("Invalid arguments");
cvReleaseImage(&DispImage);
return;
}

// Find the width and height of the image
x = img->width;
y = img->height;

// Find whether height or width is greater in order to resize the image
max = (x > y) ? x : y;

// Find the scaling factor to resize the image
scale = (float)((float)max / size);

// Used to Align the images
if (i % w == 0 && m != 20) {
m = 20;
n += 0 + size;
}

// Set the image ROI to display the current image
//cvSetImageROI(DispImage, cvRect(m, n, (int)( x/scale ), (int)( y/scale )));
cvSetImageROI(DispImage, cvRect(m, n, (int)(x / scale), (int)(y / scale)));
//      cout<<"x="<<m<<"y="<<n<<endl;

// Resize the input image and copy the it to the Single Big Image
cvResize(img, DispImage);

// Reset the ROI in order to display the next image
cvResetImageROI(DispImage);
}

// Create a new window, and show the Single Big Image
//cvNamedWindow( title, 1 );
cvShowImage(title, DispImage);

/*cvWaitKey(0);*/
//cvDestroyWindow(title);

// End the number of arguments
va_end(args);

// Release the Image Memory
cvReleaseImage(&DispImage);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: