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})
相关推荐
ZPC82101 小时前
ROS2 速度远快于 UDP的完整方案(同机节点)
人工智能·算法·计算机视觉·机器人
H Journey3 小时前
SIMD 指令集(如 AVX2, NEON)进行OPenCV加速
opencv·计算机视觉·simd指令集加速
AI人工智能+4 小时前
表格识别技术:通过深度学习与计算机视觉融合,实现复杂文档中表格的版面还原及数据的结构化转换。
深度学习·计算机视觉·ocr·表格识别
H Journey5 小时前
OpenCV进阶
人工智能·opencv·计算机视觉
H Journey5 小时前
Halcon介绍
opencv·halcon
三维频道6 小时前
深度解析:3D-DIC技术如何精准表征复合材料的变形与损伤演化?
人工智能·计算机视觉·3d·全场应变测量·dic技术·新拓三维·复合材料力学表征
羊羊小栈6 小时前
基于「YOLO目标检测 + 多模态AI分析」的智慧植物辣椒病害智能检测分析预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
xiaotao1317 小时前
04-进阶方向: 01-计算机视觉(CV)——实例分割:Mask R-CNN
人工智能·计算机视觉·r-cnn
Mr数据杨7 小时前
机载多光谱目标检测提升空中态势感知
人工智能·目标检测·机器学习·计算机视觉·数据分析·kaggle
思绪无限9 小时前
YOLOv5至YOLOv12升级:机械器件识别系统的设计与实现(完整代码+界面+数据集项目)
人工智能·python·深度学习·目标检测·计算机视觉·机械器件识别