- 操作系统: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()
)
参数
参数名 | 类型 | 描述 |
---|---|---|
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 |
代码示例
#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]