c++如何生成图像掩膜
时间: 2023-10-18 18:08:25 浏览: 42
生成图像掩膜的方法有多种,下面简单介绍一种基于OpenCV库的方法:
1. 首先,读入需要生成掩膜的图像。
```c++
cv::Mat img = cv::imread("your_image_path");
```
2. 接着,创建一个和图像大小相同的空白掩膜图像。
```c++
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
```
3. 然后,使用鼠标交互或者编程方式在掩膜图像中绘制感兴趣区域的轮廓。
```c++
// 通过鼠标交互绘制掩膜
cv::namedWindow("mask");
cv::setMouseCallback("mask", onMouse, 0);
// 或者编程方式绘制掩膜
std::vector<cv::Point> contour;
contour.push_back(cv::Point(100, 100));
contour.push_back(cv::Point(200, 100));
contour.push_back(cv::Point(200, 200));
contour.push_back(cv::Point(100, 200));
cv::fillConvexPoly(mask, &contour[0], contour.size(), cv::Scalar(255, 255, 255));
```
4. 最后,将掩膜应用到原始图像中。
```c++
cv::Mat masked_img;
img.copyTo(masked_img, mask);
```
完整代码示例:
```c++
#include <opencv2/opencv.hpp>
void onMouse(int event, int x, int y, int flags, void* param)
{
cv::Mat* mask = reinterpret_cast<cv::Mat*>(param);
if (event == cv::EVENT_LBUTTONDOWN) {
// 绘制圆形
cv::circle(*mask, cv::Point(x, y), 10, cv::Scalar(255, 255, 255), -1);
cv::imshow("mask", *mask);
}
}
int main()
{
// 读入图像
cv::Mat img = cv::imread("your_image_path");
// 创建掩膜图像
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
// 通过鼠标交互绘制掩膜
cv::namedWindow("mask");
cv::setMouseCallback("mask", onMouse, &mask);
// 或者编程方式绘制掩膜
std::vector<cv::Point> contour;
contour.push_back(cv::Point(100, 100));
contour.push_back(cv::Point(200, 100));
contour.push_back(cv::Point(200, 200));
contour.push_back(cv::Point(100, 200));
cv::fillConvexPoly(mask, &contour[0], contour.size(), cv::Scalar(255, 255, 255));
// 应用掩膜
cv::Mat masked_img;
img.copyTo(masked_img, mask);
// 显示结果
cv::imshow("original image", img);
cv::imshow("masked image", masked_img);
cv::waitKey(0);
return 0;
}
```