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})
相关推荐
saoys7 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
MM_MS7 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
旅途中的宽~8 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1
kisshuan1239610 小时前
YOLO11-RepHGNetV2实现甘蔗田杂草与作物区域识别详解
人工智能·计算机视觉·目标跟踪
_codemonster11 小时前
高斯卷积的可加性定理
人工智能·计算机视觉
li星野12 小时前
OpenCV4X学习—核心模块Core
人工智能·opencv·学习
saoys13 小时前
Opencv 学习笔记:绘制动态随机直线(附实时展示)
笔记·opencv·学习
UnderTurrets14 小时前
A_Survey_on_3D_object_Affordance
pytorch·深度学习·计算机视觉·3d
yugi98783815 小时前
用于图像分类的EMAP:概念、实现与工具支持
人工智能·计算机视觉·分类
MM_MS15 小时前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测