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 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
超龄超能程序猿7 小时前
(三)PS识别:基于噪声分析PS识别的技术实现
图像处理·人工智能·计算机视觉
Tony沈哲7 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
Chef_Chen9 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
加油吧zkf11 小时前
YOLO目标检测数据集类别:分类与应用
人工智能·计算机视觉·目标跟踪
加油吧zkf12 小时前
水下目标检测:突破与创新
人工智能·计算机视觉·目标跟踪
静心问道13 小时前
GoT:超越思维链:语言模型中的有效思维图推理
人工智能·计算机视觉·语言模型
晓131315 小时前
第七章 OpenCV篇——角点检测与特征检测
人工智能·深度学习·计算机视觉
视觉人机器视觉17 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
PyAIExplorer17 小时前
图像旋转:从原理到 OpenCV 实践
人工智能·opencv·计算机视觉