фон
Выполняя обработку изображений в 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) ;