如何利用opencv在一个窗口显示多张图片

来源:互联网 发布:amr2狙击步枪对比js 编辑:程序博客网 时间:2024/05/01 08:02

这个以前的时候,采取的是把要显示的图片copy到一张大图片上去~ 这个也忒麻烦了点


然后 在 http://download.csdn.net/detail/zhazhiqiang2010/3614993#comment  这里发现一个好用的代码。。。。


感谢上传者,记录在这里只为了以后方便使用~~~


// showManyImage.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <cv.h>#include <highgui.h>#include <stdio.h>#include <stdarg.h>#include <time.h>#include <iostream>void cvShowManyImages(char* title, int nArgs, ...) {// img - Used for getting the arguments IplImage *img;// DispImage - the image in which input images are to be copiedIplImage *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 imagefloat 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 image0DispImage = cvCreateImage( cvSize( 100+ size*w, 60 + size*h), 8, 3 );// Used to get the arguments passedva_list args;va_start(args, nArgs);// Loop for nArgs number of argumentsfor (i = 0, m = 20, n = 20; i < nArgs; i++, m += (20 + size)) {// Get the Pointer to the IplImageimg = va_arg(args, IplImage*);// Check whether it is NULL or not// If it is NULL, release the image, and returnif(img == 0) {printf("Invalid arguments");cvReleaseImage(&DispImage);return;}// Find the width and height of the imagex = img->width;y = img->height;// Find whether height or width is greater in order to resize the imagemax = (x > y)? x: y;// Find the scaling factor to resize the imagescale = (float) ( (float) max / size );// Used to Align the imagesif( 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 ImagecvResize(img, DispImage);// Reset the ROI in order to display the next imagecvResetImageROI(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 argumentsva_end(args);// Release the Image MemorycvReleaseImage(&DispImage);}int main(int argc,char **argv) {/*   CvCapture *capture;*/int i=0;IplImage *frame=cvLoadImage("c:\\oo.jpg");cvNamedWindow("video",1);cvResizeWindow("video",700,660);IplImage *frame_not=cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);cvNot(frame,frame_not);IplImage *frame_gray=cvCreateImage(cvGetSize(frame),frame->depth,1);IplImage *frame1=cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);IplImage *frame_canny=cvCreateImage(cvGetSize(frame),frame->depth,1);IplImage *frame2=cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);cvCvtColor(frame,frame_gray,CV_RGB2GRAY);cvCvtColor(frame_gray,frame1,CV_GRAY2BGR);cvCanny(frame_gray,frame_canny,20,75,3);cvCvtColor(frame_canny,frame2,CV_GRAY2BGR);cvShowManyImages("video",4,frame,frame_not,frame1,frame2);cvWaitKey();cvReleaseImage(&frame_not);cvReleaseImage(&frame1);cvReleaseImage(&frame_gray);cvReleaseImage(&frame2);cvReleaseImage(&frame_canny);cvDestroyWindow("video");return 0;}


【Note:】

注意 这个函数显示的图像是 nChannels = 3 的。


你看见 cvShowManyImages 函数中的 

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

了么~~~吼吼, 如果想要 显示 单通道  的,把   3 改为 1  就OK了~~



==============================================================================

【起初我 cvLoadImage( "tutu");  读入了之前

              【cvLoadImage(      ,0)   读入了一张图像,然后用  cvSaveImage();  保存图像】

                得到的一张图像

】  这样是可以显示的。  然后就误导了我以为 可以显示灰度图。。。。。。

后来,发现  cvLoadImage(   ,0)   读入的  灰度图 老是 出错。。。。。。



后来发现     【cvLoadImage(      ,0)   读入了一张图像,然后用  cvSaveImage();  保存图像】   之后的图像 nChanels = 3  !


才发现:

              cvSaveImage()保存的 图像只能为深度为8U的1通道或者3通道(RGB)的图像。

也就是说 nChanels = 3 , R=G=B 的  3 通道的 灰度图 

  

总之,函数只显示  通道为3 的 图像!


=========================================================================================================================================

从文件中读入一幅图像可以使用imread函数来读取图像,

Mat img=imread(filename);

该语句将filename所指定路径的指定文件读取到img数组中,该函数读取的是默认的三通道图像,读取的顺序默认情况下是BGR顺序,如果想得到单通道(灰度级的)图像,则可以使用下面的方式:

Mat img=imread(filename,0);



另一个版本:

来自: CSDN    yang_xian521 'S blog  

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



希望作者不要介意,拿来方便使用哈


/************************************************************************* Copyright(c) 2012  Yang Xian* All rights reserved.** File:showManyImage.cpp* Brief: * Version: 1.0* Author: Yang Xian* Email: yang_xian521@163.com* Date:2012/08/28* History:************************************************************************/#include"cv.h"#include "highgui.h"using namespace cv;using namespace std;void imshowMany(const std::string& _winName, const vector<Mat>& _imgs);int main(void){vector<Mat> imgs(6);imgs[0] = imread("cm.png");imgs[1] = imread("wr.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 imagefloat 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);}


原创粉丝点击