opencv半透明填充不规则区域

    之前有个需求,要为图片中几个不规则区域添加半透明的颜色,在网上搜了半天才找到需要的接口。要完成这个目标可以分为两步:填充和半透明处理:

    填充的函数接口为fillPoly:

void fillPoly(InputOutputArray img, InputArrayOfArrays pts, const Scalar& color, int lineType=LINE_8, int shift=0, Point offset=Point() )

   半透明处理的函数接口为addWeighted:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

 

先上代码:

#include <opencv2/opencv.hpp>
#include<stdio.h>
#include <string>
using namespace cv;
 
Mat src;
Mat dst;

int main()
{

    namedWindow("src", WINDOW_AUTOSIZE);//WINDOW_AUTOSIZE:系统默认,显示自适应
    src = imread("0.jpg", 1);//1:为原图颜色,0:为灰度图,黑白颜色
    src.copyTo(dst);
    
    cv::Point pt[1][5];
    pt[0][0] = cv::Point(450,100);
    pt[0][1] = cv::Point(750,100);
    pt[0][2] = cv::Point(750,350);
    pt[0][3] = cv::Point(625,500);
    pt[0][4] = cv::Point(450,350);
    const cv::Point* ppt[1]={pt[0]};
    int npt[1] = {5};
    cv::fillPoly(src,ppt,npt,1,cv::Scalar(0,255,0));
 
    //cv::rectangle(src,cv::Point(450,100),cv::Point(750,400),cv::Scalar(0,255,0),-1,8);
    cv::addWeighted(dst,0.7,src,0.3,0,dst);
    
    imshow("src", dst);
    waitKey(0);
 
    return 0;
}

运行结果如下:

opencv半透明填充不规则区域