opencv单个窗口显示多幅图像

功能描述:单个窗口显示多幅图像,类似于Matlab中的函数subplot,不过没有这个函数功能强大,只是实现了显示,可以设置显示窗口的的大小,子显示窗口的数量,灰度以及二值图像。

主要函数:resize,copyto,cvtcolor

环境:windows7+vs2010+opencv2.4.8

工程地址:http://download.csdn.net/detail/chengkun183/7611889

源代码:

// MergrFrame.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include 

using namespace std;
using namespace cv;
#define readcamera 0;//参数为1读取摄像头的视频,参数为0读取一张图片

void MergeImage(int row,//显示窗口的子窗口行数
				int col,//显示窗口的子窗口列数
				int width,//显示窗口的宽度
				int height,//显示窗口的高度
				vector&image,//要显示的图像的向量
				Mat &MerImg,//显示窗口图片
				int isResizeImage=1//是否缩放图片,默认等于1按图像原始比例缩放到子窗口中
									//等于0,按子窗口的的比例显示图像
				);
vectorimage;
Mat MerImg;



int _tmain(int argc, _TCHAR* argv[])
{	
#if readcamera
	VideoCapture cap(0);
	Mat frame;
	Mat gray,binimg,srchsv;
	while (cap.isOpened())
	{
		cap>>frame;

		Mat src=frame.clone();
		cvtColor(src,gray,CV_BGR2GRAY);//原始图像转换为灰度,此时为单通道,用来测试显示
		cvtColor(src,srchsv,CV_BGR2HSV);//原始图像转换颜色空间,此时为三通道,用来测试显示
		threshold(gray,binimg,180,255,CV_THRESH_BINARY);//转换为二值图像,此时为单通道,测试显示

		image.push_back(src);
		image.push_back(srchsv);
		image.push_back(gray);
		image.push_back(binimg);

		MergeImage(2,2,900,600,image,MerImg);
		image.clear();//清空向量,为下一次做准备
		imshow("MerImg",MerImg);

		char c=waitKey(40);//按esc退出
		if (c==27)
		{
			break;
		}
	}
#else
	Mat src=imread("lena.png");
	Mat gray,binimg,srchsv;

	cvtColor(src,gray,CV_BGR2GRAY);
	cvtColor(src,srchsv,CV_BGR2HSV);
	threshold(gray,binimg,180,255,CV_THRESH_BINARY);

	image.push_back(src);
	image.push_back(srchsv);
	image.push_back(gray);
	image.push_back(binimg);

	MergeImage(2,2,800,600,image,MerImg);
	imshow("MerImg",MerImg);
	waitKey(60000);
#endif
	return 0;
 }
void MergeImage(int row,int col,int width,int height,vector&inputimage,Mat &MerImg,int isResizeImage)
{
	int EachWndWidth;
	int EachWndHeight;
	Rect RectRoi;
	Mat TempImg;
	vectorimage;

	//检查图像子窗口和图像的数量是否相等,不等:输出提示信息
	if (row*colps)?(ch/ph):(cw/pw); //缩放比例因子
			int      rw=(int)pw*scale;//缩放后图片的宽
			int      rh=(int)ph*scale;//缩放后图片的高 
			Mat      TempMat=Mat(Size(rw,rh),CV_8UC3);
			Mat      DisplayMat=Mat(Size(cw,ch),CV_8UC3);
			Rect	 RectRoiRoi=Rect((cw-rw)/2,(ch-rh)/2,rw,rh);

			resize(inputimage[i],TempMat,Size(rw,rh));
			TempMat.copyTo(DisplayMat(RectRoiRoi));
			image.push_back(DisplayMat);
		}
	}
	else
	{
		for (int i=0;i

摄像头显示结果:

opencv单个窗口显示多幅图像_第1张图片

lena.jpg图像显示结果:

opencv单个窗口显示多幅图像_第2张图片

你可能感兴趣的:(OpenCV学习记录)