1 為圖像增加透明通道
一般人像摳圖相關(guān)的AI模型會輸出一個(gè)Mask圖,這個(gè)Mask圖就是我們需要的可以將人物摳出來的Alpha通道信息,我們需要將這個(gè)Mask圖附加到原始圖片上,從BGR圖片轉(zhuǎn)成BGRA圖片或者從RGB圖片轉(zhuǎn)成RGBA圖片。
如果使用OpenCV進(jìn)行圖像處理,在為圖像增加透明通道時(shí)會使用到cv::split
和cv::merge
方法,先使用cv::split
方法分離原始圖片各個(gè)通道,然后將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圖片必須與原始圖片具有相同的分辨率大小和相同的數(shù)據(jù)類型,比如原始圖片是1920x1080,CV_8UC3的圖片,那么Mask圖片必須是1920x1080,CV_8UC1的圖片。
如果你的OpenCV是編譯了CUDA,還可以將上述代碼修改成CUDA版本
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版本進(jìn)行計(jì)算相比CPU會快很多,但是經(jīng)過我對上面CPU和CUDA版本的運(yùn)行時(shí)間的測試,發(fā)現(xiàn)最終處理的時(shí)間是差不多的,我分析這個(gè)原因是在使用CUDA版本時(shí),需要將cpu上的圖片使用upload
方法從內(nèi)存?zhèn)鬟f到顯存中,計(jì)算完成還需要將最終的結(jié)果圖片通過download
方法從顯存?zhèn)鬟f到內(nèi)存中,如果圖片比較大,這種HostToDevice和DeviceToHost是比較耗時(shí)的。文章來源:http://www.zghlxwxcb.cn/news/detail-568463.html
參考鏈接
- https://answers.opencv.org/question/31136/fastest-way-to-apply-alpha-channel-to-image/
有興趣可以訪問我的個(gè)人站:https://www.stubbornhuang.com/文章來源地址http://www.zghlxwxcb.cn/news/detail-568463.html
到了這里,關(guān)于OpenCV - 圖片增加透明通道,圖片合并透明通道的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!