【OpenCV】CUDA模块4:copyMakeBorder()

cv::cuda::copyMakeBorder 是 OpenCV 的 CUDA 模块中的一个函数,用于在 GPU 上为图像矩阵添加边框(padding)。这个函数类似于 OpenCV 的标准 cv::copyMakeBorder 函数,但它是针对 GPU 加速设计的。

通过 cv::cuda::copyMakeBorder,你可以在图像周围添加额外的像素行和列,以扩展图像的大小。

函数原型:

void cv::cuda::copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar(), Stream& stream = Stream::Null());

src:输入图像,类型为 cv::cuda::GpuMat。
dst:输出图像,类型为 cv::cuda::GpuMat,包含了添加了边框的输入图像。
top、bottom、left、right:分别指定在图像顶部、底部、左侧和右侧要添加的边框像素数量。
borderType:边框类型,可以是 cv::BORDER_CONSTANT、cv::BORDER_REPLICATE、cv::BORDER_REFLECT 或 cv::BORDER_WRAP 等之一。
value:当 borderType 设置为 cv::BORDER_CONSTANT 时,用于填充边框的常数值。
stream:CUDA 流,用于异步执行 CUDA 调用。
使用 cv::cuda::copyMakeBorder 可以方便地在 GPU 上对图像进行边框扩展,这在许多图像处理任务中都是必要的步骤,比如卷积操作、滤波等。

示例:

#include <opencv2/opencv.hpp>  
#include <opencv2/cudaimgproc.hpp>  
  
int main()  
{  
    // 初始化 CUDA  
    cv::cuda::setDevice(0); // 设置要使用的 GPU 设备  
  
    // 读取图像到 GpuMat  
    cv::Mat hostImage = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);  
    cv::cuda::GpuMat gpuImage(hostImage);  
  
    // 定义边框的大小  
    int top = 10, bottom = 10, left = 10, right = 10;  
  
    // 定义输出 GpuMat  
    cv::cuda::GpuMat gpuResult;  
  
    // 在 GPU 上添加边框  
    cv::cuda::copyMakeBorder(gpuImage, gpuResult, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar::all(0));  
  
    // (可选)将结果从 GPU 拷贝回 CPU  
    cv::Mat result(gpuResult);  
  
    // ... 处理或显示 result ...  
  
    return 0;  
}

在这个示例中,我们首先读取了一张灰度图像到 GpuMat,然后使用 cv::cuda::copyMakeBorder 在图像周围添加了指定大小的常数边框(值为 0)。最后,我们将结果从 GPU 拷贝回 CPU(如果需要的话)。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cv::copyMakeBorder函数是OpenCV中的一个函数,用于在图像的边缘添加边框。纯C++实现该函数需要以下步骤: 1. 定义一个新的图像,大小为原图像加上上、下、左、右四个方向的边框大小。 2. 将原图像复制到新图像中间的部分。 3. 对于上、下、左、右四个边框,分别使用cv::copyTo函数将原图像的一部分复制到新图像的对应位置。 以下是一个简单的实现示例: ```cpp void copyMakeBorder(const cv::Mat& src, cv::Mat& dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value) { int srcRows = src.rows; int srcCols = src.cols; int dstRows = srcRows + top + bottom; int dstCols = srcCols + left + right; dst.create(dstRows, dstCols, src.type()); // 复制原图像到新图像中间 src.copyTo(dst(cv::Rect(left, top, srcCols, srcRows))); // 添加上下左右四个边框 if (top > 0) { cv::Mat roi = dst(cv::Rect(0, 0, dstCols, top)); cv::Mat srcRoi = src(cv::Rect(0, 0, srcCols, top)); cv::copyTo(srcRoi, roi); } if (bottom > 0) { cv::Mat roi = dst(cv::Rect(0, dstRows - bottom, dstCols, bottom)); cv::Mat srcRoi = src(cv::Rect(0, srcRows - bottom, srcCols, bottom)); cv::copyTo(srcRoi, roi); } if (left > 0) { cv::Mat roi = dst(cv::Rect(0, 0, left, dstRows)); cv::Mat srcRoi = src(cv::Rect(0, 0, left, srcRows)); cv::copyTo(srcRoi, roi); } if (right > 0) { cv::Mat roi = dst(cv::Rect(dstCols - right, 0, right, dstRows)); cv::Mat srcRoi = src(cv::Rect(srcCols - right, 0, right, srcRows)); cv::copyTo(srcRoi, roi); } } ``` 其中,参数说明如下: - src:原图像 - dst:目标图像,将原图像加上边框后的结果 - top、bottom、left、right:上、下、左、右四个方向的边框大小 - borderType:边框类型,可以选择BORDER_CONSTANT、BORDER_REPLICATE等 - value:当使用BORDER_CONSTANT边框类型时,填充的颜色值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值