C++ 程序使用 OpenCV 库来创建一个图像金字塔,然后将这些图像合并成一张大图

文章目录

源码文件

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;
}

功能解读

  1. 创建图像金字塔 :程序首先创建一个 std::vector<cv::Mat> 类型的容器 imagePyramid 来存储图像金字塔的各层。接着,通过一个循环生成了一系列彩色图像(共8张),每张图像的尺寸和颜色随循环变量 i 改变。图像尺寸逐渐减小,模拟金字塔的效果。

  2. 计算合并图像的尺寸:程序计算出图像金字塔中的图像的最大宽度和最大高度,以确定合并后图像的总尺寸。

  3. 创建合并图像 :使用计算出的最大宽度和最大高度,程序创建了一个足够大的空白彩色图像 mergedImage,用于容纳图像金字塔中的所有图像。背景被设置为黑色。

  4. 合并图像 :程序遍历图像金字塔中的每一张图像,并将它们复制到 mergedImage 的适当位置。这通过计算每张图像在合并图像中的区域(ROI)并使用 copyTo 函数完成。

  5. 保存合并后的图像 :合并后的图像被保存为 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})
相关推荐
我没胡说八道6 小时前
高校论文AI检测优化工具对比研究与实测分析(2026)
人工智能·深度学习·机器学习·计算机视觉·aigc·论文
探物 AI8 小时前
把 MambaOut 塞进 YOLOv11:会有什么样的反应
python·yolo·计算机视觉
_李小白12 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习
我最爱吃鱼香茄子15 小时前
终极方案:JetBrains IDE永久解放C盘空间
计算机视觉·性能优化·电脑·笔记本电脑·intellij-idea·程序员创富·webstorm
玖釉-16 小时前
Vulkan 离屏渲染详解:从 Framebuffer 到后处理、阴影贴图与 Render Texture
c++·windows·计算机视觉·图形渲染
路人甲32616 小时前
SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control
人工智能·深度学习·计算机视觉·机器人·具身智能
程序员正茂17 小时前
EasyAR使用OpenCV下USB摄像头作为自定义相机
opencv·unity·easyar
_李小白17 小时前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
armwind17 小时前
openISP学习8-GC — Gamma Correction(Gamma 校正)
图像处理·计算机视觉
大江东去浪淘尽千古风流人物18 小时前
【VGGT-Ω】前馈式3D重建的规模化之路:Register Attention、自监督训练与10B参数Scaling Law深度解析
深度学习·计算机视觉·transformer·slam·vio·3d重建