文章目录
源码文件
cpp
#include <iostream>
#include <vector>
#include <string>
#include <opencv2/opencv.hpp>
int main() {
// 这里应该有代码来生成或加载一系列图像到 imagePyramid
std::vector<cv::Mat> imagePyramid;
int image_name = 0; // 用于生成输出文件名
// 示例:创建一系列彩色图像加入到金字塔中
for (int i = 0; i < 8; ++i) {
// 修改颜色值以确保即使在 i=0 时也有颜色
cv::Mat img(100/(i+1), 100/(i+1), CV_8UC3, cv::Scalar((50*i + 50) % 255, (100*i + 50) % 255, (150*i + 50) % 255));
imagePyramid.push_back(img);
}
// 创建一个空白图像来容纳八张图像
int rows = 4;
int cols = 2;
cv::Mat mergedImage;
// 计算合并后图像的尺寸
int maxWidth = 0;
int maxHeight = 0;
for (const cv::Mat& image : imagePyramid) {
maxWidth = std::max(maxWidth, image.cols);
maxHeight = std::max(maxHeight, image.rows);
}
// 创建合并后的彩色图像
mergedImage.create(maxHeight * rows, maxWidth * cols, CV_8UC3);
mergedImage.setTo(cv::Scalar(0, 0, 0)); // 将背景设置为黑色
// 将每张图像复制到合并图像的对应位置
int index = 0;
for (int row = 0; row < rows; ++row) {
for (int col = 0; col < cols; ++col) {
if (index >= imagePyramid.size())
break;
cv::Mat image = imagePyramid[index];
// 计算当前图像的ROI位置
int x = col * maxWidth;
int y = row * maxHeight;
cv::Rect roi(x, y, image.cols, image.rows);
// 将当前图像复制到合并图像的ROI
image.copyTo(mergedImage(roi));
++index;
}
}
cv::imwrite("./" + std::to_string(image_name) + "_mergedImage.jpg", mergedImage);
image_name++;
return 0;
}
功能解读
-
创建图像金字塔 :程序首先创建一个
std::vector<cv::Mat>
类型的容器imagePyramid
来存储图像金字塔的各层。接着,通过一个循环生成了一系列彩色图像(共8张),每张图像的尺寸和颜色随循环变量i
改变。图像尺寸逐渐减小,模拟金字塔的效果。 -
计算合并图像的尺寸:程序计算出图像金字塔中的图像的最大宽度和最大高度,以确定合并后图像的总尺寸。
-
创建合并图像 :使用计算出的最大宽度和最大高度,程序创建了一个足够大的空白彩色图像
mergedImage
,用于容纳图像金字塔中的所有图像。背景被设置为黑色。 -
合并图像 :程序遍历图像金字塔中的每一张图像,并将它们复制到
mergedImage
的适当位置。这通过计算每张图像在合并图像中的区域(ROI)并使用copyTo
函数完成。 -
保存合并后的图像 :合并后的图像被保存为 JPEG 文件,文件名基于变量
image_name
。每次程序运行后,image_name
会递增,以便下次运行时生成新的文件名。
总结来说,这个程序的主要用途是生成一个图像金字塔并将其层合并成一张大图。这在图像处理、特征提取或其他计算机视觉任务中很有用。代码中对图像尺寸和颜色的具体选择是为了演示目的,并可以根据实际需求进行调整。
编译文件
bash
cmake_minimum_required(VERSION 3.10)
project(ImagePyramid)
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 找到OpenCV包
find_package(OpenCV REQUIRED)
# 包含OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加可执行文件
add_executable(ImagePyramid main.cpp)
# 链接OpenCV库
target_link_libraries(ImagePyramid ${OpenCV_LIBS})