OpenCV cv::fillPoly 生成任意多边形 mask
在有些图像处理场景,需要对某块不规则的图像区域进行过滤,此时可以先用cv::fillPoly()函数预先生成相应的mask,然后再将待过滤的图像与
mask进行与操作。
注意: cv::fillPoly()中出入的多边形点集的顺序不是随机的,而是按照多边形封闭的原则,多边形的点是按照顺时针方向或逆时针方向依次存储.
/*----------------------------------------------------------------------------------------
** 注意: cv::fillPloy 第二个参数点顺序不能是随意的,而是要按照图形封闭的原则,按顺时针
** 或逆时针顺序排列, 比如下面的梯形:
**
** top left<1> ---------> top right<2>
** / \
** / \
** / \
** bottom left<4> <------------------ bottom right<3>
**
** ---------------------------------------------------------------------------------------*/
void OpenCV_Generate_ROI_Mask(const cv::Point &tl, const cv::Point &tr,\
const cv::Point &bl, const cv::Point &br,\
int w, int h, cv::Mat &mask_img)
{
mask_img = cv::Mat::zeros(h, w, CV_8UC1);
std::vector<cv::Point> pts;
pts.push_back(tl); // 1
pts.push_back(tr); // 2
pts.push_back(br); // 3
pts.push_back(bl); // 4
cv::fillPoly(mask_img, pts, 255); // Gray mask, for BGR: cv::fillPoly(mask_img, pts, cv::Scalar(0,0,255))
//cv::imwrite("Mask.png", mask_img);
return;
}
cv::bitwise_and(image, roi_mask, image); //待过滤的图像与mask进行与操作.
评论已关闭