使蒙版外全部透明

Make all transparent outside the mask

我有 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 通道,但不清楚我下一步需要做什么以及如何实现它。

如何在遮罩外获得透明背景?

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

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

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...