OpenCV: agregue canales transparentes a imágenes, combine canales transparentes en imágenes

1 Añade un canal de transparencia a la imagen.

Generalmente, el modelo de IA relacionado con el recorte de retratos generará un mapa de máscara. Este mapa de máscara es la información del canal alfa que necesitamos para recortar los personajes. Necesitamos adjuntar este mapa de máscara a la imagen original y convertir la imagen BGR en una imagen BGRA o convertir de imágenes RGB a imágenes RGBA.

cv::splitSi usa OpenCV para el procesamiento de imágenes, usará el método y al agregar un canal transparente a la imagen cv::merge. Primero use cv::splitel método para separar cada canal de la imagen original, luego agregue la máscara al canal original y finalmente use el cv::mergesintetizado . Nuevo canal para generar la imagen final.

El código de muestra es el siguiente.

#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;
}

Cabe señalar que la imagen de máscara debe tener el mismo tamaño de resolución y el mismo tipo de datos que la imagen original. Por ejemplo, si la imagen original es una imagen de 1920 x 1080, CV_8UC3, entonces la imagen de máscara debe ser una imagen de 1920 x 1080, CV_8UC1.

Si su OpenCV está compilado con CUDA, también puede modificar el código anterior a la versión 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;
}

Lógicamente hablando, usar la versión CUDA de OpenCV para los cálculos será mucho más rápido que usar la CPU, sin embargo, después de probar el tiempo de ejecución de las versiones de CPU y CUDA anteriores, descubrí que el tiempo de procesamiento final es aproximadamente el mismo. "La razón de esto es que estoy usando CUDA. Al versionar, el método de uso de la imagen en la CPU debe uploadtransferirse de la memoria a la memoria de video. Una vez completado el cálculo, la imagen del resultado final debe transferirse downloaddesde el memoria de video a la memoria a través del método. Si la imagen es relativamente grande, HostToDevice y DeviceToHost consumen más tiempo.

Link de referencia

Si está interesado, puede visitar mi sitio web personal: https://www.stubbornhuang.com/

Supongo que te gusta

Origin blog.csdn.net/HW140701/article/details/131674594
Recomendado
Clasificación