- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::cuda::createBoxFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个 盒式滤波器(Box Filter),它在 GPU 上对图像进行卷积操作。这个滤波器常用于图像平滑(模糊),其原理是对图像中每个像素的邻域区域取平均值。
函数原型
cv::Ptr<cv::cuda::Filter> cv::cuda::createBoxFilter
(
int srcType, // 输入图像类型
int dstType, // 输出图像类型(通常设为 -1 表示与输入相同)
cv::Size ksize, // 卷积核大小(例如 Size(5, 5))
cv::Point anchor = cv::Point(-1, -1), // 锚点位置,默认为中心点
int borderMode = cv::BORDER_DEFAULT, // 边界填充方式
cv::Scalar borderVal = cv::Scalar::all(0) // 常量边界时的填充值
);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
srcType | int | 输入图像的数据类型,如 CV_8UC3(8位无符号三通道图像)。 |
dstType | int | 输出图像的数据类型。若为 -1,表示与输入图像相同。 |
ksize | cv::Size | 卷积核大小(宽 x 高),例如 cv::Size(5, 5)。建议使用奇数尺寸以保证锚点居中。 |
anchor | cv::Point | 卷积核的锚点位置,默认是 (-1, -1),即中心点。 |
borderMode | int | 边界扩展模式,常用值:cv::BORDER_DEFAULT, cv::BORDER_CONSTANT, cv::BORDER_REPLICATE 等。 |
borderVal | cv::Scalar | 如果 borderMode == BORDER_CONSTANT,则用该值填充边界,默认为黑色(全零)。 |
代码示例
#include <iostream>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/cudafilters.hpp>
int main()
{
// 读取图像
cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );
if ( h_img.empty() )
{
std::cerr << "Error: Image not found!" << std::endl;
return -1;
}
// 将图像转换为支持的数据类型
cv::Mat h_gray;
if ( h_img.channels() == 3 )
{
cv::cvtColor( h_img, h_gray, cv::COLOR_BGR2GRAY ); // 转换为灰度图像
}
else if ( h_img.channels() == 4 )
{
std::vector< cv::Mat > channels;
cv::split( h_img, channels );
h_gray = channels[ 0 ]; // 使用第一个通道作为灰度图像
}
else
{
h_gray = h_img; // 如果已经是单通道,则直接使用
}
// 上传图像到 GPU
cv::cuda::GpuMat d_src, d_dst;
d_src.upload( h_gray );
// 创建 Box Filter
cv::Ptr< cv::cuda::Filter > boxFilter = cv::cuda::createBoxFilter( d_src.type(), // 输入图像类型
-1, // 输出类型与输入一致
cv::Size( 5, 5 ), // 卷积核大小
cv::Point( -1, -1 ), // 锚点默认为中心
cv::BORDER_DEFAULT // 默认边界处理
);
// 应用滤波器
boxFilter->apply( d_src, d_dst );
// 下载结果回 CPU
cv::Mat h_dst;
d_dst.download( h_dst );
// 显示结果
cv::imshow( "Original", h_img );
cv::imshow( "Box Filtered", h_dst );
cv::waitKey( 0 );
return 0;
}