• 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

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

OpenCV 发布于2023-07-12 阅读 2,717次 0次评论 0次点赞 本文共1627个字,阅读需要5分钟。

1 为图像增加透明通道

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

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

示例代码如下

#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版本

#include "opencv2/opencv.hpp"
#include "opencv2/cudaimgproc.hpp"
#include "opencv2/cudawarping.hpp"
#include "opencv2/cudaarithm.hpp"

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是比较耗时的。

参考链接

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:OpenCV – 图片增加透明通道,图片合并透明通道

原文链接:https://www.stubbornhuang.com/2722/

发布于:2023年07月12日 9:37:06

修改于:2023年07月12日 9:49:08

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
TensorRT - 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题
TensorRT
下一篇
WordPress - 优化Google Adsense广告js的加载速度
WordPress
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号