在C++中使用OpenCV创建多边形掩模(Polygon Mask)是一种常见的图像处理任务,尤其是在需要对图像的特定区域进行分析或处理时。OpenCV提供了多种方法来实现这一功能,最常用的方式是使用`fillPoly`或`fillConvexPoly`函数来创建掩模。
### 使用`fillPoly`创建多边形掩模
`fillPoly`函数可以用于填充多个多边形区域,适用于非凸多边形。它的基本用法如下:
```cpp
void cv::fillPoly(cv::InputOutputArray img,
const cv::Point** pts,
const int* npts,
int ncontours,
const cv::Scalar& color,
int lineType = 8,
int shift = 0,
cv::Point offset = cv::Point());
```
- `img`:输出图像,通常是一个单通道的掩模图像。
- `pts`:指向多边形顶点数组的指针。
- `npts`:每个多边形的顶点数。
- `ncontours`:多边形的数量。
- `color`:填充颜色,通常为白色(255)。
- `lineType`:线条类型,可选值包括8连通或4连通。
#### 示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <vector>
int main() {
// 创建一个空白图像作为掩模
cv::Mat mask = cv::Mat::zeros(500, 500, CV_8UC1);
// 定义多边形的顶点
std::vector<cv::Point> polygon;
polygon.push_back(cv::Point(100, 100));
polygon.push_back(cv::Point(200, 50));
polygon.push_back(cv::Point(300, 150));
polygon.push_back(cv::Point(250, 300));
polygon.push_back(cv::Point(150, 250));
// 创建一个指向多边形顶点的指针数组
const cv::Point* pts[] = { polygon.data() };
int npts[] = { (int)polygon.size() };
// 填充多边形
cv::fillPoly(mask, pts, npts, 1, cv::Scalar(255), 8, 0, cv::Point());
// 显示掩模图像
cv::imshow("Mask", mask);
cv::waitKey(0);
return 0;
}
```
### 使用`fillConvexPoly`创建凸多边形掩模
如果多边形是凸的,可以使用`fillConvexPoly`函数,它比`fillPoly`更高效。
```cpp
void cv::fillConvexPoly(cv::InputOutputArray img,
const cv::Point* pts,
int npts,
const cv::Scalar& color,
int lineType = 8,
int shift = 0);
```
- `img`:输出图像。
- `pts`:多边形顶点数组。
- `npts`:顶点数量。
- `color`:填充颜色。
- `lineType`:线条类型。
#### 示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <vector>
int main() {
// 创建一个空白图像作为掩模
cv::Mat mask = cv::Mat::zeros(500, 500, CV_8UC1);
// 定义凸多边形的顶点
std::vector<cv::Point> polygon;
polygon.push_back(cv::Point(100, 100));
polygon.push_back(cv::Point(200, 50));
polygon.push_back(cv::Point(300, 150));
polygon.push_back(cv::Point(250, 300));
polygon.push_back(cv::Point(150, 250));
// 填充凸多边形
cv::fillConvexPoly(mask, polygon.data(), (int)polygon.size(), cv::Scalar(255), 8, 0);
// 显示掩模图像
cv::imshow("Mask", mask);
cv::waitKey(0);
return 0;
}
```
### 使用掩模进行图像处理
一旦创建了掩模,可以使用`cv::bitwise_and`函数将掩模应用到原始图像上,以提取感兴趣区域(ROI)。
```cpp
cv::Mat src = cv::imread("input.jpg");
cv::Mat result;
cv::bitwise_and(src, src, result, mask);
cv::imshow("Result", result);
cv::waitKey(0);
```
通过上述方法,可以灵活地创建多边形掩模并应用于各种图像处理任务中。掩模技术在目标检测、图像分割等领域有广泛应用,特别是在结合深度学习模型(如Mask R-CNN)时[^1]。
---