功能描述:单个窗口显示多幅图像,类似于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
摄像头显示结果:
lena.jpg图像显示结果: