使所有面罩外透明

时间:2018-07-19 11:51:03

标签: c++ opencv image-processing mask image-manipulation

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

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

1 个答案:

答案 0 :(得分:1)

首先,按照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 ...