OpenCV CUDA模块图像处理------颜色空间处理之GPU 上对两张带有 Alpha 通道的图像进行合成操作函数alphaComp()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数用于在 GPU 上对两张带有 Alpha 通道的图像进行合成操作。支持多种常见的 Alpha 合成模式(Porter-Duff 合成规则),例如图像叠加、裁剪、异或等。

适用于图像叠加、视频抠像、UI 合成等场景,常用于游戏开发、图形渲染、视频特效等领域。

函数原型

cpp 复制代码
void cv::cuda::alphaComp 	
(
 	InputArray  	img1,
	InputArray  	img2,
	OutputArray  	dst,
	int  	alpha_op,
	Stream &  	stream = Stream::Null() 
) 	

参数

参数名 描述
img1 第一张图像。支持类型:CV_8UC4、CV_16UC4、CV_32SC4 和 CV_32FC4。
img2 第二张图像。必须与 img1 具有相同的大小和相同的数据类型。
dst 目标图像(输出结果)。
alpha_op 指定 Alpha 混合操作的标志符,取值包括: ALPHA_OVER ALPHA_IN ALPHA_OUT ALPHA_ATOP ALPHA_XOR ALPHA_PLUS ALPHA_OVER_PREMUL ALPHA_IN_PREMUL ALPHA_OUT_PREMUL ALPHA_ATOP_PREMUL ALPHA_XOR_PREMUL ALPHA_PLUS_PREMUL ALPHA_PREMUL
stream 用于异步执行的 CUDA 流对象。

代码示例

cpp 复制代码
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 加载两张 PNG 图像(带透明通道)
    cv::Mat img1 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/stich1.png", cv::IMREAD_UNCHANGED);
    cv::Mat img2 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/stich2.png", cv::IMREAD_UNCHANGED);

    if (img1.empty() || img2.empty()) {
        std::cerr << "无法加载图像!" << std::endl;
        return -1;
    }

    // 打印原始图像信息用于调试
    std::cout << "img1 size: " << img1.size() << ", type: " << img1.type() << std::endl;
    std::cout << "img2 size: " << img2.size() << ", type: " << img2.type() << std::endl;

    // 如果不是 BGRA 格式,则转换为 BGRA(四通道)
    cv::Mat img_bgra1 = (img1.channels() == 4) ? img1 : cv::Mat();
    cv::Mat img_bgra2 = (img2.channels() == 4) ? img2 : cv::Mat();

    if (!img_bgra1.data) cv::cvtColor(img1, img_bgra1, cv::COLOR_BGR2BGRA);
    if (!img_bgra2.data) cv::cvtColor(img2, img_bgra2, cv::COLOR_BGR2BGRA);

    // 确保图像尺寸一致
    if (img_bgra1.size() != img_bgra2.size()) {
        std::cerr << "图像尺寸不一致,正在调整 img2 到 img1 尺寸..." << std::endl;
        cv::resize(img_bgra2, img_bgra2, img_bgra1.size());
    }

    // 确保图像类型一致
    if (img_bgra1.type() != img_bgra2.type()) {
        std::cerr << "图像类型不一致,正在统一转换为 CV_8UC4..." << std::endl;
        img_bgra1.convertTo(img_bgra1, CV_8UC4);
        img_bgra2.convertTo(img_bgra2, CV_8UC4);
    }

    // 上传到 GPU
    cv::cuda::GpuMat d_img1, d_img2, d_dst;
    d_img1.upload(img_bgra1);
    d_img2.upload(img_bgra2);

    // 执行 Alpha 合成
    cv::cuda::alphaComp(d_img1, d_img2, d_dst, cv::cuda::ALPHA_OVER);

    // 下载结果并显示
    cv::Mat result;
    d_dst.download(result);

    cv::imshow("合成1",img1);
    cv::imshow("合成2",img2);
    cv::imshow("合成结果", result);
    cv::waitKey(0);

    return 0;
}

运行结果


相关推荐
拆房老料1 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
运维行者_2 小时前
应用性能监控怎么选?从调用链到用户体验的五个能力维度
运维·服务器·数据库·人工智能·mysql·性能优化·应用性能监控
张张123y2 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
国科安芯6 小时前
四重证据,一条逻辑链:商业航天级微控制器MCU抗辐射验证方法学综述——以国科安芯AS32S601为例
人工智能·单片机·嵌入式硬件·mcu·安全·抗辐射
dk_tjy7 小时前
AI驱动的自动化攻击背景下:企业端点安全体系的技术架构与建设路径
网络·人工智能·安全·自动化·终端安全管理·数据防泄漏
布吉岛的石头7 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
2601_965454237 小时前
用AI把开源项目功能清单做成MG动画介绍视频
人工智能·开源·音视频
风雅GW7 小时前
局域网访问为何少一半配置页:DSH 的安全边界设计复盘
人工智能
衡石科技7 小时前
同一句业务问题,怎样持续问对数?衡石 ChatBI 的语义准备与回归验证
人工智能·数据挖掘·回归·chatbi
新新学长搞科研8 小时前
【会议征稿 | 杭州站】第七届机器学习与计算机应用国际学术会议 (ICMLCA 2026)
人工智能·机器学习·计算机