c++ opencv,如何在cv::Mat上添加一个指定区域的 梯形 mask ,半透明
时间: 2024-02-23 13:01:46 浏览: 159
要在cv::Mat上添加一个指定区域的梯形mask,半透明,可以按照以下步骤进行:
1. 创建一个与cv::Mat大小相同的alpha通道图像,初始值为0;
2. 将指定区域的alpha通道设置为非0值,表示这个区域需要半透明;
3. 创建一个梯形mask,将其转换为alpha通道图像;
4. 将原始图像与alpha通道图像合并,这样就可以实现半透明效果。
下面是示例代码:
```c++
cv::Mat img = cv::imread("image.jpg");
cv::Mat alpha = cv::Mat::zeros(img.size(), CV_8UC1);
// 设置指定区域的alpha通道为非0值
cv::Rect roi(100, 100, 200, 200);
alpha(roi) = 128;
// 创建梯形mask
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::Point pts[4] = { cv::Point(100, 100), cv::Point(300, 100), cv::Point(250, 200), cv::Point(150, 200) };
cv::fillConvexPoly(mask, pts, 4, cv::Scalar(255, 255, 255));
// 将mask转换为alpha通道
cv::Mat alpha_mask;
cv::cvtColor(mask, alpha_mask, cv::COLOR_GRAY2BGRA);
// 合并图像和alpha通道
cv::Mat result;
cv::multiply(alpha_mask, alpha, alpha_mask, 1.0 / 255.0);
cv::multiply(alpha_mask, img, result, 1.0 / 255.0);
// 显示结果
cv::imshow("result", result);
cv::waitKey(0);
```
在上面的代码中,我们首先读取了一张图像,然后创建一个与图像大小相同的alpha通道图像,并将指定区域的alpha通道设置为128,表示这个区域需要半透明。接着,我们创建了一个梯形mask,并将其转换为alpha通道图像。最后,我们将alpha_mask和alpha通道相乘,并将结果再与原始图像相乘,得到最终结果。
阅读全文