OpenCVCUDA 模块中在 GPU 上对图像或矩阵进行 边界填充(padding)函数copyMakeBorder()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::cuda::copyMakeBorder 是 OpenCV 的 CUDA 模块中的一个函数,用于在 GPU 上对图像或矩阵进行 边界填充(padding)。它类似于 CPU 版本的 cv::copyMakeBorder,但运行在 GPU 上,适用于 cv::cuda::GpuMat 数据。

函数原型

cpp 复制代码
void cv::cuda::copyMakeBorder
(
    InputArray src,
    OutputArray dst,
    int top,
    int bottom,
    int left,
    int right,
    int borderType,
    Scalar value = Scalar(),
    Stream& stream = Stream::Null()
)

参数

参数名 类型 描述
src InputArray 输入图像(可以是 cv::Mat 或 cv::cuda::GpuMat)。
dst OutputArray 输出图像(与输入类型一致,通常为 cv::cuda::GpuMat)。
top int 顶部添加的像素行数。
bottom int 底部添加的像素行数。
left int 左侧添加的像素列数。
right int 右侧添加的像素列数。
borderType int 边界类型,见下文说明。
value Scalar 如果边界类型为 BORDER_CONSTANT,则使用该值填充,默认为 0。
stream Stream& CUDA 流对象,用于异步执行。默认为 Stream::Null(),即同步执行。

功能描述

该函数将输入图像复制到输出图像中,并在其四周添加指定大小的边框区域。这个操作常用于:

  • 卷积前的图像填充;
  • 图像尺寸调整;
  • 构造更大的图像画布;
  • 预处理阶段满足某些算法对输入尺寸的要求

边界类型 (borderType)

支持以下几种常见的边界填充方式:

类型 含义
BORDER_CONSTANT 使用固定值填充边界(需提供 value 参数)
BORDER_REPLICATE 复制最边缘的像素值来填充边界
BORDER_REFLECT 对称反射填充,不包括边缘像素:例如 `1 2 3 → 3 2 1
BORDER_REFLECT_101 / BORDER_DEFAULT 对称反射填充,包括边缘像素:例如 `1 2 3 → 2 1 2 3
BORDER_WRAP 包裹填充:例如 `1 2 3 → 3 1 2 3

代码示例

cpp 复制代码
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaimgproc.hpp>  // 必须包含 cudaimgproc 才能使用 copyMakeBorder
#include <opencv2/opencv.hpp>

int main()
{
    // 创建测试图像(CPU)
    cv::Mat h_src = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );

    // 上传到 GPU
    cv::cuda::GpuMat d_src;
    d_src.upload( h_src );

    // 设置边界参数
    int top = 1, bottom = 1, left = 1, right = 1;
    int borderType = cv::BORDER_CONSTANT;
    cv::Scalar value( 0 );  // 填充黑色边界

    // 调用 copyMakeBorder
    cv::cuda::GpuMat d_dst;
    cv::cuda::copyMakeBorder( d_src, d_dst, top, bottom, left, right, borderType, value );

    // 下载回 CPU
    cv::Mat h_dst;
    d_dst.download( h_dst );

    std::cout << "Original:\n" << h_src << std::endl;
    std::cout << "Padded:\n" << h_dst << std::endl;

    return 0;
}

运行结果

bash 复制代码
Original:
[ 1,  2,  3;
  4,  5,  6;
  7,  8,  9]

Padded:
[ 0,  0,  0,  0,  0;
  0,  1,  2,  3,  0;
  0,  4,  5,  6,  0;
  0,  7,  8,  9,  0;
  0,  0,  0,  0,  0]
相关推荐
在所不辞兄3 分钟前
【零基础学智能仿真-67】力学知识库与检索增强
人工智能·深度学习·神经网络·机器学习·智能仿真
云上先途5 分钟前
下一代搜索优化重点优化哪些维度,和旧SEO思路有什么不同?
人工智能
楚山之石6 分钟前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
海宇大数据39 分钟前
零信任架构实战:基于海宇全能小微企业报告构建自动化持牌网络小贷小微商户极速助业贷秒级全维风险决策网关
网络·人工智能·架构·自动化
hkNaruto1 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒1 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
ZhengEnCi1 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
vilya1 小时前
Agent 语音引擎换心记:从「够用」到「稳且好」
人工智能·agent
王中阳Go1 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型
70后写java的老码农1 小时前
Ollama 大模型私有化部署与彻底卸载指南(Windows/Linux)
人工智能