OpenCV CUDA模块图像变形------对图像进行GPU加速的仿射变换函数warpAffine()

发布于:2025-06-14 ⋅ 阅读:(21) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数用于对图像进行 GPU 加速的仿射变换(Affine Transformation),是 cv::warpAffine 的 CUDA 版本。支持平移、旋转、缩放、翻转等常见几何变换操作。

函数原型

void cv::cuda::warpAffine 	
(
 	InputArray  	src,
	OutputArray  	dst,
	InputArray  	M,
	Size  	dsize,
	int  	flags = INTER_LINEAR,
	int  	borderMode = BORDER_CONSTANT,
	Scalar  	borderValue = Scalar(),
	Stream &  	stream = Stream::Null() 
) 		

参数

参数名 说明
src 源图像。支持像素深度为 CV_8UCV_16UCV_32SCV_32F 的图像,通道数为 1、3 或 4。
dst 目标图像,类型与 src 相同,尺寸为 dsize
M 2x3 的仿射变换矩阵(Mat 或 UMat 类型)。
dsize 目标图像的尺寸(宽 x 高)。
flags 插值方法组合(参考 resize 函数),以及可选标志 WARP_INVERSE_MAP,表示 M 是一个逆变换(即从目标图像到源图像的映射)。仅支持 INTER_NEARESTINTER_LINEARINTER_CUBIC 插值方法。
borderMode 像素外推方法(边界填充方式)。
borderValue 边界填充值,默认为黑色(0)。
stream 用于异步版本的 CUDA 流对象。

代码示例

#include <opencv2/cudawarping.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 读取图像
    cv::Mat h_src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );
    if ( h_src.empty() )
    {
        std::cerr << "无法加载图像!" << std::endl;
        return -1;
    }

    // 上传到 GPU
    cv::cuda::GpuMat d_src, d_dst;
    d_src.upload( h_src );

    // 构造仿射变换矩阵:绕中心旋转 30 度
    cv::Point2f center( h_src.cols / 2.0F, h_src.rows / 2.0F );
    cv::Mat M = cv::getRotationMatrix2D( center, 30, 1.0 );

    // 设置输出尺寸
    cv::Size dsize( h_src.cols, h_src.rows );

    // 执行仿射变换
    cv::cuda::warpAffine( d_src, d_dst, M, dsize, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar() );

    // 下载并显示结果
    cv::Mat h_dst;
    d_dst.download( h_dst );
    cv::imshow( "Original Image", h_src );
    cv::imshow( "Warped Image", h_dst );
    cv::waitKey( 0 );

    return 0;
}

在这里插入图片描述