背景
在Matlab中做图像处理可以很方便地在一个窗口中同时显示好几张图片, 但可惜的是OpenCV中并未提供此功能, 但好在C++拥有充分的灵活性, 可以自己写函数弥补这方面的不足.
思路
将多张图片放在c++中的vector里,构造一个足以容纳多张图片,并以行列形式排列的Mat对象,将该Mat对象使用imshow来可视化图片
代码实现
void multipleImage(vector<Mat> imgVector, Mat& dst, int imgCols) //参数为列
{
const int MAX_PIXEL=300;
int imgNum = imgVector.size();
//选择图片最大的一边 将最大的边按比例变为300像素
Size imgOriSize = imgVector[0].size();
int imgMaxPixel = max(imgOriSize.height, imgOriSize.width);
//获取最大像素变为MAX_PIXEL的比例因子
double prop = imgMaxPixel < MAX_PIXEL ? (double)imgMaxPixel/MAX_PIXEL : MAX_PIXEL/(double)imgMaxPixel;
Size imgStdSize(imgOriSize.width * prop, imgOriSize.height * prop); //窗口显示的标准图像的Size
Mat imgStd; //标准图片
Point2i location(0, 0); //坐标点(从0,0开始)
//构建窗口大小 通道与imageVector[0]的通道一样
Mat imgWindow(imgStdSize.height*((imgNum-1)/imgCols + 1), imgStdSize.width*imgCols, imgVector[0].type());
for (int i=0; i<imgNum; i++)
{
location.x = (i%imgCols)*imgStdSize.width;
location.y = (i/imgCols)*imgStdSize.height;
resize(imgVector[i], imgStd, imgStdSize, prop, prop, INTER_LINEAR); //设置为标准大小
imgStd.copyTo( imgWindow( Rect(location, imgStdSize) ) );
}
dst = imgWindow;
}
注释:
1)void multipleImage(vector imgVector, Mat& dst, int imgCols) 中第一个参数:存放Mat的vector对象;第二个参数:保存的Mat对象;第三个参数:每行放多少张图片
2) const int MAX_PIXEL=300;—这个是允许要修改的图片的最大高宽,需要手动调来适应自己的实际需求
实际使用
void multipleImage(vector<Mat> imgVector, Mat& dst, int imgCols) {
....
}
vector<cv::Mat> imgVector;
cv::Mat image1,image2,image3;
...
imgVector.push_back(image1);
imgVector.push_back(image2);
imgVector.push_back(image3);
cv::Mat dst;
multipleImage(imgVector, dst, 2) ;