当前位置: 首页 > news >正文

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 数据。

函数原型

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()
)

参数

参数名类型描述
srcInputArray输入图像(可以是 cv::Mat 或 cv::cuda::GpuMat)。
dstOutputArray输出图像(与输入类型一致,通常为 cv::cuda::GpuMat)。
topint顶部添加的像素行数。
bottomint底部添加的像素行数。
leftint左侧添加的像素列数。
rightint右侧添加的像素列数。
borderTypeint边界类型,见下文说明。
valueScalar如果边界类型为 BORDER_CONSTANT,则使用该值填充,默认为 0。
streamStream&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

代码示例

#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 );// 上传到 GPUcv::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 );  // 填充黑色边界// 调用 copyMakeBordercv::cuda::GpuMat d_dst;cv::cuda::copyMakeBorder( d_src, d_dst, top, bottom, left, right, borderType, value );// 下载回 CPUcv::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;
}

运行结果

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]

相关文章:

  • 994. 腐烂的橘子
  • MiMo-7B-RL调研
  • 《Vuejs设计与实现》第 5 章(非原始值响应式方案) 中
  • 手机换地方ip地址会变化吗?深入解析
  • 开发工具分享: Web前端编码常用的在线编译器
  • 支持向量机算法
  • C++GO语言微服务之Dockerfile docker-compose
  • 深入理解Embedding Models(嵌入模型):从原理到实战(下)
  • 针对面试-mysql篇
  • 洛谷 P1955 [NOI2015] 程序自动分析
  • FPGA----petalinux开机启动自定义脚本/程序的保姆级教程(二)
  • 人工智能100问☞第21问:神经网络如何模拟人脑结构?
  • The Graph:区块链数据索引的技术架构与创新实践
  • 探索大语言模型(LLM):国产大模型DeepSeek vs Qwen,谁才是AI模型的未来?
  • 2025 年福建省职业院校技能大赛网络建设与运维赛项Linux赛题解析
  • 高速边坡监测成本高?自动化如何用精准数据省预算?
  • Java 语法基础(笔记)
  • element plus el-table多选框跨页多选保留
  • Flutter - UIKit开发相关指南 - 控制器,主题,表单
  • Java SpringMVC 和 MyBatis 整合关键配置详解
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 习近平向多哥新任领导人致贺电
  • 证券时报:中美互降关税落地,订单集中补发港口将迎高峰期
  • 国台办:实现祖国完全统一是大势所趋、大义所在、民心所向
  • 国内首家破产的5A景区游客爆满,洛阳龙潭大峡谷:破产并非因景观不好