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]
相关推荐
兰亭妙微7 小时前
用户体验的真正边界在哪里?对的 “认知负荷” 设计思考
人工智能·ux
13631676419侯7 小时前
智慧物流与供应链追踪
人工智能·物联网
TomCode先生7 小时前
MES 离散制造核心流程详解(含关键动作、角色与异常处理)
人工智能·制造·mes
zd2005727 小时前
AI辅助数据分析和学习了没?
人工智能·学习
johnny2337 小时前
强化学习RL
人工智能
乌恩大侠7 小时前
无线网络规划与优化方式的根本性变革
人工智能·usrp
放羊郎7 小时前
基于萤火虫+Gmapping、分层+A*优化的导航方案
人工智能·slam·建图·激光slam
王哈哈^_^7 小时前
【数据集+完整源码】水稻病害数据集,yolov8水稻病害检测数据集 6715 张,目标检测水稻识别算法实战训推教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
SEOETC8 小时前
数字人技术:虚实交融的未来图景正在展开
人工智能
boonya8 小时前
从阿里云大模型服务平台百炼看AI应用集成与实践
人工智能·阿里云·云计算