OpenCV一个窗口同时显示多张图片 (C++) ---转载

背景

在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) ;

猜你喜欢

转载自blog.csdn.net/qq_42178122/article/details/128498050