做了一个简单的去水印功能,基于文字检测去图片水印。效果如下:
插件功能代码参考如下:
using namespace cv::dnn;
TextDetectionModel_DB *textDetector=0;
void getTextDetector()
{if(textDetector)return;String modelPath = "text_detection_DB_TD500_resnet18_2021sep.onnx"; //模型权重文件textDetector=new TextDetectionModel_DB(modelPath);float binThresh = 0.3; //二值图的置信度阈值float polyThresh = 0.5 ; //文本多边形阈值double unclipRatio = 2.0; //检测到的文本区域的未压缩比率,gai比率确定输出大小uint maxCandidates = 200;textDetector->setBinaryThreshold(binThresh).setPolygonThreshold(polyThresh).setUnclipRatio(unclipRatio).setMaxCandidates(maxCandidates);double scale = 1.0 / 255.0;int height = 736; //输出图片长宽int width = 736;Size inputSize = Size(width, height);Scalar mean = Scalar(122.67891434, 116.66876762, 104.00698793);textDetector->setInputParams(scale, inputSize, mean);}void deWaterMarkTextDetection(Mat &input,Mat &output,Mat &src,string)
{getTextDetector();// 推理std::vector<std::vector<Point>> results;textDetector->detect(input, results);Mat mask = Mat::zeros(input.size(), CV_8U);fillPoly(mask, results,Scalar::all(255));//将掩模进行膨胀,使其能够覆盖图像更大区域Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));dilate(mask, mask, kernel);//使用inpaint进行图像修复Mat result;inpaint(src, mask, output, 1, INPAINT_NS);
}