OpenCV - 图片增加透明通道,图片合并透明通道

1 为图像增加透明通道

一般人像抠图相关的AI模型会输出一个Mask图,这个Mask图就是我们需要的可以将人物抠出来的Alpha通道信息,我们需要将这个Mask图附加到原始图片上,从BGR图片转成BGRA图片或者从RGB图片转成RGBA图片。

如果使用OpenCV进行图像处理,在为图像增加透明通道时会使用到cv::splitcv::merge方法,先使用cv::split方法分离原始图片各个通道,然后将Mask加入到原始通道中,最后使用cv::merge合成新的通道生成最后的图片。

示例代码如下

cpp 复制代码
#include "opencv2/opencv.hpp"

cv::Mat MergeAlpha(const cv::Mat& src_image, const cv::Mat& alpha_image)
{
	std::vector<cv::Mat> channels;
	cv::split(src_image, channels);
	channels.push_back(alpha_image);
	cv::Mat src_alpha;
	cv::merge(channels, src_alpha);
	return src_alpha;
}

需要注意的是,Mask图片必须与原始图片具有相同的分辨率大小和相同的数据类型,比如原始图片是1920x1080,CV_8UC3的图片,那么Mask图片必须是1920x1080,CV_8UC1的图片。

如果你的OpenCV是编译了CUDA,还可以将上述代码修改成CUDA版本

cpp 复制代码
cv::Mat MergeAlphaCUDA(const cv::Mat& src_image, const cv::Mat& alpha_image)
{
	cv::cuda::GpuMat src_image_gpu;
	src_image_gpu.upload(src_image);

	cv::cuda::GpuMat alpha_image_gpu;
	alpha_image_gpu.upload(alpha_image);

	std::vector<cv::cuda::GpuMat> channels;
	cv::cuda::split(src_image_gpu, channels);
	channels.push_back(alpha_image_gpu);
	cv::cuda::GpuMat src_alpha_gpu;
	cv::cuda::merge(channels, src_alpha_gpu);

	cv::Mat result;
	src_alpha_gpu.download(result);

	src_image_gpu.release();
	alpha_image_gpu.release();
	src_alpha_gpu.release();

	for (int i = 0; i < channels.size(); ++i)
	{
		channels[i].release();
	}

	return result;
}

按理来说,使用OpenCV的CUDA版本进行计算相比CPU会快很多,但是经过我对上面CPU和CUDA版本的运行时间的测试,发现最终处理的时间是差不多的,我分析这个原因是在使用CUDA版本时,需要将cpu上的图片使用upload方法从内存传递到显存中,计算完成还需要将最终的结果图片通过download方法从显存传递到内存中,如果图片比较大,这种HostToDevice和DeviceToHost是比较耗时的。

参考链接

有兴趣可以访问我的个人站:https://www.stubbornhuang.com/

相关推荐
_李小白10 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习
程序员正茂15 小时前
EasyAR使用OpenCV下USB摄像头作为自定义相机
opencv·unity·easyar
_李小白15 小时前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
点云兔子19 小时前
舱口检测:从点云到矩形定位的射线投影算法
opencv·算法·点云·舱口检测
蝈蝈Tjguo20 小时前
opencv 与摄影测量 相机坐标系的区别
人工智能·数码相机·opencv
盼小辉丶20 小时前
OpenCV-Python实战(26)——复杂场景下的实时物体检测与跟踪
python·opencv·计算机视觉
咸鱼翻身小阿橙1 天前
在VScode使用C#并且调用opencv库
vscode·opencv·c#
咸鱼翻身小阿橙2 天前
高斯模糊降噪/磨皮算法降噪图像
前端·opencv·算法·webpack·c#
嵌入式老牛2 天前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
故渊at3 天前
第一板块:Android 系统基石与运行原理 | 第五篇:Context 上下文与资源配置体系
android·人工智能·opencv·context·上下文·资源配置体系