- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
该函数用于在 GPU 上对两张带有 Alpha 通道的图像进行合成操作。支持多种常见的 Alpha 合成模式(Porter-Duff 合成规则),例如图像叠加、裁剪、异或等。
适用于图像叠加、视频抠像、UI 合成等场景,常用于游戏开发、图形渲染、视频特效等领域。
函数原型
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 流对象。 |
代码示例
#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;
}
运行结果