首页 > 解决方案 > 使蒙版外全部透明

问题描述

我有 jpg 图像和多边形,我想以这种方式用作蒙版:应该显示这个多边形内的图像,并且这个多边形之外的所有图像都应该是 100% 透明的。现在我只实现了第一个目标——我可以在多边形内显示图像,但在它之外都是黑色的:

cv::Mat image;

//load image

image.convertTo(image, CV_8UC3, 255.0);

std::vector<cv::Point> contour;

//load polygon

const cv::Point* elementPoints[1] = { &contour[0] };
int numberOfPoints = (int)contour.size();

cv::Mat mask = cv::Mat::zeros(image.size(), image.type());

cv::fillPoly(mask, elementPoints, &numberOfPoints, 1, cv::Scalar( 255, 255, 255), 8);

cv::Mat dstImage = cv::Mat::zeros(image.size(), image.type());

cv::bitwise_and(image, mask, dstImage);

imwrite("test.jpg", dstImage);

我知道我需要使用 alpha 通道,但目前还不清楚我接下来需要做什么以及如何实现它。

如何在蒙版之外获得透明背景?

标签: c++opencvimage-processingmaskimage-manipulation

解决方案


首先,按照此答案中的描述创建具有四个通道的图像。对第四个通道使用负源使其已经归零。你现在有一个完全透明的图像。

像以前一样创建你的蒙版,只是使用不同的 RGBA 值(注意,Scalaralpha 值有第四个构造函数参数):

cv::fillPoly(mask, elementPoints, &numberOfPoints, 1, cv::Scalar(0, 0, 0, 255), 8);

最后,应用蒙版将相关区域设置为完全不透明:

cv::bitwise_or(image, mask, dstImage);

您可能希望保留原始图像的 RGB 值(以便稍后进行操作)或清除它们(这将导致更高的压缩率,从而更小的文件大小)。如果是后者,请使用 RGBA 设置为 0, 0, 0, 0 的反转蒙版,并使用bitwise_and...


推荐阅读