我有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通道,但是尚不清楚下一步需要做什么以及如何实现。
如何在遮罩外获得透明背景?
答案 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
...