OpenCV отображает несколько изображений в одном окне одновременно (С++) --- Перепечатано

фон

Выполняя обработку изображений в Matlab, можно легко отображать несколько картинок в одном окне одновременно, но жаль, что эта функция не предусмотрена в OpenCV, но, к счастью, C++ имеет достаточную гибкость, и вы можете написать свои собственные функции для составления для этого недостатка аспекта.

ход мыслей

Поместите несколько изображений в вектор в С++, создайте объект 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): векторный объект, хранящий мат; второй параметр: сохраненный мат-объект; третий параметр: сколько картинок помещать в каждую строку
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) ;

Acho que você gosta

Origin blog.csdn.net/qq_42178122/article/details/128498050
Recomendado
Clasificación