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

[复制链接]
发表于 2025-5-13 14:51:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 操纵系统: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 数据。
函数原型

  1. void cv::cuda::copyMakeBorder
  2. (
  3.     InputArray src,
  4.     OutputArray dst,
  5.     int top,
  6.     int bottom,
  7.     int left,
  8.     int right,
  9.     int borderType,
  10.     Scalar value = Scalar(),
  11.     Stream& stream = Stream::Null()
  12. )
复制代码
参数

参数名类型形貌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 1BORDER_REFLECT_101 / BORDER_DEFAULT对称反射添补,包括边缘像素:例如 `1 2 3 → 2 1 2 3BORDER_WRAP包裹添补:例如 `1 2 3 → 3 1 2 3 代码示例

  1. #include <opencv2/cudaarithm.hpp>
  2. #include <opencv2/cudaimgproc.hpp>  // 必须包含 cudaimgproc 才能使用 copyMakeBorder
  3. #include <opencv2/opencv.hpp>
  4. int main()
  5. {
  6.     // 创建测试图像(CPU)
  7.     cv::Mat h_src = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );
  8.     // 上传到 GPU
  9.     cv::cuda::GpuMat d_src;
  10.     d_src.upload( h_src );
  11.     // 设置边界参数
  12.     int top = 1, bottom = 1, left = 1, right = 1;
  13.     int borderType = cv::BORDER_CONSTANT;
  14.     cv::Scalar value( 0 );  // 填充黑色边界
  15.     // 调用 copyMakeBorder
  16.     cv::cuda::GpuMat d_dst;
  17.     cv::cuda::copyMakeBorder( d_src, d_dst, top, bottom, left, right, borderType, value );
  18.     // 下载回 CPU
  19.     cv::Mat h_dst;
  20.     d_dst.download( h_dst );
  21.     std::cout << "Original:\n" << h_src << std::endl;
  22.     std::cout << "Padded:\n" << h_dst << std::endl;
  23.     return 0;
  24. }
复制代码
运行结果

  1. Original:
  2. [ 1,  2,  3;
  3.   4,  5,  6;
  4.   7,  8,  9]
  5. Padded:
  6. [ 0,  0,  0,  0,  0;
  7.   0,  1,  2,  3,  0;
  8.   0,  4,  5,  6,  0;
  9.   0,  7,  8,  9,  0;
  10.   0,  0,  0,  0,  0]
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表