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;
}
运行结果如下: