在有些图像处理场景,需要对某块不规则的图像区域进行过滤,此时可以先用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进行与操作.












标签: none

评论已关闭