1 画像に透明チャンネルを追加する
一般的にポートレート切り抜き関連のAIモデルはマスクマップを出力しますが、このマスクマップは文字を切り出すために必要なアルファチャンネル情報であり、このマスクマップを元の画像に貼り付けてBGR画像を変換する必要があります。 BGRA イメージ、または RGB イメージから RGBA イメージに変換します。
画像処理に OpenCV を使用する場合、画像に透明なチャネルを追加するときにcv::split
と メソッドを使用しますcv::merge
。最初にcv::split
メソッドを使用して元の画像の各チャネルを分離し、次に元のチャネルにマスクを追加し、最後に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;
}
マスク イメージは、元のイメージと同じ解像度サイズおよび同じデータ型を持つ必要があることに注意してください。たとえば、元のイメージが 1920x1080、CV_8UC3 イメージの場合、マスク イメージは 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;
}
論理的に言えば、CPU を使用するよりも CUDA バージョンの OpenCV を使用して計算を行った方がはるかに高速になりますが、上記の CPU バージョンと CUDA バージョンの実行時間をテストしたところ、最終的な処理時間はほぼ同じであることがわかりました。これはCUDAを使用しているためです バージョン管理の際、CPU上の画像使用方法をupload
メモリからビデオメモリに転送する必要があります 計算が完了した後、最終結果画像をビデオメモリdownload
から転送する必要があります画像が比較的大きい場合は、HostToDevice と DeviceToHost の方が時間がかかります。
参考リンク
ご興味がございましたら、私の個人ウェブサイトをご覧ください: https://www.stubbornhuang.com/