C# 证件照替换底色与设置背景图---PaddleSegSharp
PaddleSegSharp 是一个基于百度飞桨PaddleSeg项目的人像分割模块而开发的.NET的工具类库。
PaddleSegSharp 中PaddleSeg.dll文件是基于开源项目最新发布版本PaddleSeg PaddleSeg的版本修改而成的C++动态库,基于opencv的x64编译而成的。
PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥感、娱乐等场景落地应用。
本项目只能在X64的CPU上编译和使用,只能在avx指令集上的CPU上使用,目前仅支持windows平台。
PaddleSegSharp 支持飞桨人像抠图的所有模型。PP-MattingV2-512、PP-Matting-512、PP-Matting-1024、PP-HumanMatting、MODNet-MobileNetV2。 默认使用MODNet-MobileNetV2模型。
1、新建winform项目
2、添加引用PaddleSegSharp ,使用NuGet 搜索添加PaddleSegSharp
3、窗体上添加图片显示控件以及按钮
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PaddleSegSharp;namespace WindowsFormzhengjian
{public partial class Form1 : Form{#region 字段private string[] bmpFilters = new string[] { ".bmp", ".jpg", ".jpeg", ".tiff", ".tif", ".png" };private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";private PaddleSegMattingEngine engine;MattingParameter parameter;string modelPath = null;string path = Environment.CurrentDirectory + @"\out\";/// <summary>/// 创建画布的画板背景/// </summary>Bitmap backgroundImage = null;#endregionpublic Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//初始化 引擎engine = new PaddleSegMattingEngine();//参数parameter = new MattingParameter();//parameter.outbgfile = true;//输出mask图//parameter.bgtransparent = true;//背景透明engine.Init(modelPath, parameter);if (!Directory.Exists(path)){Directory.CreateDirectory(path);}}/// <summary>/// 选择图片/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelectPic_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = fileFilter;if (ofd.ShowDialog() == DialogResult.OK){//pictureBox1.Image = new Bitmap(ofd.FileName);using (FileStream ms = File.OpenRead(ofd.FileName)){//解决内存异常问题,以及this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms)导致的一般性gdi+ 问题using (Bitmap bt = new Bitmap(ms)){#region MyRegion//backgroundImage = new Bitmap(bt.Width, bt.Height);Graphics g = pbx.CreateGraphics();//Graphics g = Graphics.FromImage(backgroundImage);g.DrawLine(Pens.Black, startPoint, e.Location);g.Clear(Color.White);Pen myPen = new Pen(Color.Black, int.TryParse(ConfigurationManager.AppSettings["penwidth"], out int penwidth) ? penwidth : 3);//g.SmoothingMode = SmoothingMode.AntiAlias;//g.CompositingQuality = CompositingQuality.HighQuality;//g.CompositingMode = CompositingMode.SourceOver;//g.DrawImage(bt, bt.Width, bt.Height);PointF pointFstart = PointToPointF(startPoint);PointF pointFend = PointToPointF(e.Location);g.DrawBeziers(myPen, new PointF[] { pointFstart, pointFend });//pbx.BackgroundImage = backgroundImage;//g.Dispose();bt.Save("Fingerprint.jpg");this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms); #endregionbackgroundImage = new Bitmap(bt.Width, bt.Height, bt.PixelFormat);Graphics g = Graphics.FromImage(backgroundImage);g.SmoothingMode = SmoothingMode.AntiAlias;g.CompositingQuality = CompositingQuality.HighQuality;g.CompositingMode = CompositingMode.SourceOver;g.DrawImage(bt, 0, 0);backgroundImage.Save("Fingerprint11.jpg");//pictureBox1.Image = Image.FromHbitmap(backgroundImage.GetHbitmap());pictureBox1.Image = backgroundImage;g.Dispose();pictureBox1.Refresh();}}#region ok参数//MattingParameter parameter = new MattingParameter();初始化引擎//PaddleSegMattingEngine engine = new PaddleSegMattingEngine();//engine.Init(modelPath, parameter);设置背景颜色//engine.Setbackground(45, 145, 255);分割后的文件//string outfile = Guid.NewGuid().ToString() + ".png";//string outbgfile = Path.GetFileNameWithoutExtension(outfile) + "_bg.png";//engine.Seg(ofd.FileName, outfile, outbgfile); #endregion}this.Refresh();}/// <summary>/// 替换背景色/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnReplaceBackground_Click(object sender, EventArgs e){if (pictureBox1.Image != null){参数ok//MattingParameter parameter = new MattingParameter();初始化引擎//PaddleSegMattingEngine engine = new PaddleSegMattingEngine();//engine.Init(modelPath, parameter);设置背景颜色//Color bgcolor = Color.White;//ColorDialog colorDialog = new ColorDialog();//colorDialog.Color = bgcolor;//if (colorDialog.ShowDialog() != DialogResult.OK) return;//bgcolor = colorDialog.Color;//engine.Setbackground(bgcolor.R, bgcolor.G, bgcolor.B);engine.Setbackground(45, 145, 255);分割后的文件//string outfile = Guid.NewGuid().ToString() + ".png";//string outbgfile = Path.GetFileNameWithoutExtension(outfile) + "_bg.png";engine.Seg("小一寸.png", outfile, outbgfile);engine.Seg(new Bitmap("小一寸.png"), outfile, outbgfile);//engine.Seg(pictureBox1.Image, outfile, outbgfile);engine = new PaddleSegMattingEngine();engine.Init(modelPath, parameter);Color bgcolor = Color.White;ColorDialog colorDialog = new ColorDialog();colorDialog.Color = bgcolor;if (colorDialog.ShowDialog() != DialogResult.OK) return;bgcolor = colorDialog.Color;engine.Setbackground(bgcolor.R, bgcolor.G, bgcolor.B);//engine.SetbackgroundFile("");string outfile = path + Guid.NewGuid().ToString() + ".png";string outbgfile = path + Path.GetFileNameWithoutExtension(outfile) + "_bg.png";engine.Seg(pictureBox1.Image, outfile, outbgfile);//engine.Setbackground(45, 145, 255);分割后的文件//string outfile = "C:\\" + Guid.NewGuid().ToString() + ".bmp";//engine.Seg("C:\\Users\\Administrator\\Desktop\\1.jpg", outfile, "mask图路径");pictureBox2.Image = new Bitmap(outfile);}}/// <summary>/// 替换背景图/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSetBackground_Click(object sender, EventArgs e){if (pictureBox1.Image != null){engine = new PaddleSegMattingEngine();engine.Init(modelPath, parameter);OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = fileFilter;if (ofd.ShowDialog() != DialogResult.OK)return;engine.SetbackgroundFile(ofd.FileName);string outfile = path + Guid.NewGuid().ToString() + ".png";string outbgfile = path + Path.GetFileNameWithoutExtension(outfile) + "_bg.png";//string outfile = path + "1.png";//string outbgfile = path + "1_bg.png";engine.Seg(pictureBox1.Image, outfile, outbgfile);pictureBox2.Image = new Bitmap(outfile);}}private void btnSave_Click(object sender, EventArgs e){if (pictureBox2.Image != null){SaveFileDialog fileDialog = new SaveFileDialog();fileDialog.Filter = "Image files (JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png|" +"JPeg files (*.jpg;*.jpeg)|*.jpg;*.jpeg |GIF files (*.gif)|*.gif |BMP files (*.b" +"mp)|*.bmp|Tiff files (*.tif;*.tiff)|*.tif;*.tiff|Png files (*.png)| *.png |All f" +"iles (*.*)|*.*";if ((fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)){string path = fileDialog.FileName.ToString();pictureBox2.Image.Save(path);}}}private void btnOCR_Click(object sender, EventArgs e){//OpenFileDialog ofd = new OpenFileDialog();//ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";//if (ofd.ShowDialog() != DialogResult.OK)// return;//var imagebyte = File.ReadAllBytes(ofd.FileName);//Bitmap bitmap = new Bitmap(new MemoryStream(imagebyte));//OCRModelConfig config = null;//OCRParameter oCRParameter = new OCRParameter();//OCRResult ocrResult = new OCRResult();//using (PaddleOCREngineengine = new PaddleOCREngine(config, oCRParameter))//{// ocrResult = engine.DetectText(bitmap);//}//if (ocrResult != null)//{// MessageBox.Show(ocrResult.Text, "识别结果");//}}}
}
相关文章:

C# 证件照替换底色与设置背景图---PaddleSegSharp
PaddleSegSharp 是一个基于百度飞桨PaddleSeg项目的人像分割模块而开发的.NET的工具类库。 PaddleSegSharp 中PaddleSeg.dll文件是基于开源项目最新发布版本PaddleSeg PaddleSeg的版本修改而成的C动态库,基于opencv的x64编译而成的。 PaddleSeg是基于飞桨PaddlePa…...

HCIA-HarmonyOS Device Developer 课程大纲
一:OpenHarmony 介绍 - ( 3 课时) - OpenHarmony 简介;OpenHarmony 设计理念;OpenHarmony 设计理念概述; - OpenHarmony 试图解决的问题;应用生态割裂问题;用户数据割裂问题&#…...

洗地机哪个牌子最好用?十大名牌洗地机排行榜
作为一种新兴的智能家居产品,洗地机的市场规模已经突破了百亿大关。如此庞大的市场自然吸引了大量资本的涌入,许多品牌纷纷推出自己的洗地机产品,试图在这个竞争激烈的市场中占据一席之地。然而,面对如此多的品牌和型号࿰…...

Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)
一、Git上获取xlua 最新的xlua包,下载地址链接:https://github.com/Tencent/xLua 二、Unity添加xlua 解压xlua压缩包后,将xlua里的Assets里的文件直接复制进Unity的Assets文件夹下。 成功导入后,unity工具栏会出现xlua选项。 …...

Qt 基于FFmpeg的视频转换器 - 转GIF动图
Qt 基于FFmpeg的视频转换器 - 转GIF动图 引言一、设计思路二、核心源码三、参考链接 引言 gif格式的动图可以通过连续播放一系列图像或视频片段来展示动态效果,使信息更加生动形象,可以很方便的嵌入到网页或者ppt中。上图展示了视频的前几帧转为gif动图的…...

HTML新春烟花盛宴
目录 写在前面 烟花盛宴 完整代码 修改文字...

第十四届蓝桥杯c++研究生组
A 混乘数字 关键思路是求每个十进制数的数字以及怎么在一个数组中让判断所有的数字次数相等。 求每个十进制的数字 while(n!0){int x n%10;//x获取了n的每一个位数字n/10;}扩展:求二进制的每位数字 (注意:进制转换、1的个数、位运算&#…...

KDD 2024|基于隐空间因果推断的微服务系统根因定位
简介:本文介绍了由清华大学、南开大学、eBay、微软、中国科学院计算机网络信息中心等单位共同合作的论文《基于隐空间因果推断的受限可观测性场景的微服务系统根因定位》。该论文已被KDD 2024会议录用。 论文标题:Microservice Root Cause Analysis Wit…...

白鹭群优化算法,原理详解,MATLAB代码免费获取
白鹭群优化算法(Egret Swarm Optimization Algorithm,ESOA)是一种受自然启发的群智能优化算法。该算法从白鹭和白鹭的捕食行为出发,由三个主要部分组成:坐等策略、主动策略和判别条件。将ESOA算法与粒子群算法(PSO)、遗传算法(GA)…...

【源码】2024完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城
后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 前端UNIAPP 后端PHP 一键部署版本 获取方式: 微:uucodes...

Java-数组内存解析
文章目录 1.内存的主要结构:栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构:栈、堆 2.一维数组的内存解析 举例1:基本使用 举例2:两个变量指向一个数组 3.二维数组的内存解析 举例1: 举例2&am…...

Spring Cache --学习笔记
一、概述 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caffeine Redis(常…...

NTP服务的DDoS攻击:原理和防御
NTP协议作为一种关键的互联网基础设施组件,旨在确保全球网络设备间的时钟同步,对于维护数据一致性和安全性至关重要。然而,其设计上的某些特性也为恶意行为者提供了发动大规模分布式拒绝服务(DDoS)攻击的机会。以下是NTP服务DDoS攻击及其防御…...

【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略
【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略 一、脏读(Dirty Read)二、不可重复读(Non-repeatable Read)三、幻读(Phantom Read)四、总结 💖The Begi…...

函数式接口:现代编程的利器
1. 引言 在软件开发的演进过程中,函数式编程(Functional Programming, FP)逐渐显露头角,成为解决复杂问题的有效工具之一。函数式接口作为函数式编程的核心概念之一,其重要性不言而喻。本文将深入探讨函数式接口的概念…...

2022职称继续教育--深入实施新时代人才强国战略 加快建设世界重要人才中心和创新高地
单选题(共7题,每题5分) 1、()实行职位职级制工资为主。 D、中长线科研重要岗位人员 2、建设世界重要人才中心和创新高地有()个阶段目标。 B、三 3、综合国力竞争说到底是(…...

kube-prometheus-stack 识别 k8s 集群内所有的 ServiceMonitor 和 PrometheusRule
默认情况下,kube-prometheus-stack 只自己创建的 ServiceMonitor,如果 k8s 集群内有多个非 kube-prometheus-stack 创建的 ServiceMonitor,不会被识别到。PrometheusRule 同理。 要识别所有的 ServiceMonitor 和 PrometheusRule ,…...

Android 图片加载glide库 一次通关
前言 Glide是一个由Bumptech开发的开源图片加载库,专门用于Android平台。它被广泛应用于Android应用中,以简化图片加载过程,并提高性能和效率。 Glide能够快速加载图片,同时减少页面加载时间和内存消耗。Glide具有强大的缓存机制…...

Spring OAuth2:开发者的安全盾牌!(上)
何利用Spring OAuth2构建坚不可摧的安全体系?如何使用 OAuth2 从跨域挑战到性能优化,每一个环节都为你的应用保驾护航? 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…...

设计模式使用(成本扣除)
前言 名词解释 基础名词 订单金额:用户下单时支付的金额,这个最好理解 产品分成:也就是跟其他人合做以后我方能分到的金额,举个例子,比如用户订单金额是 100 块,我方的分成是 80%,那么也就是…...

输入输出(2)——C++的标准输出流
目录 一、C的标准输出流 (一)cout、cerr和clog流对象 1、cout 流对象 2、cerr 流对象 3、clog流对象 (二)用函数put输出字符 (三)用函数 write 输出字符 一、C的标准输出流 标准输出流——流向标准输…...

C语言序列化和反序列化--TPL(一)
TPL TPL说明网站 C语言中高效的序列化 您可以使用tpl快速轻松地存储和重新加载C数据。Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。该API很小,并试图保持“不碍事”。Tpl可以序列化许多C数据类型,包括结构。Tpl与文件、内存缓冲区和文件…...

Session + JWT + Cookie
00:HTTP无状态(为了保持状态,前端好麻烦,又要自己存,又要想办法带出去,于是使用cookie) 01:Cookie 将用户信息,在每次请求时候 带给后端(但是自己存储大小有…...

PaddleOCR2.7+Qt5
章节一:Windows 下的 PIP 安装 官网安装教程地址 按照里面的教程去安装 如果使用cuda版本的还要安装tensorrt,不然后面运行demo程序的程序会报如下错。 下载TensorRT 8版本,tensorrt下载地址 章节二:编译源码 进入官网源码地址 下…...

在Android中解析XML文件并在RecyclerView中显示
1. 引言 最近工作有解析外部xml文件在App中显示的需求,特来写篇文章记录一下,方便下次使用。 2. 准备工作 首先,在项目的AndroidManifest.xml文件中添加读取外部存储的权限声明。 <uses-permission android:name"android.permiss…...

Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture
Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目,旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目,目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…...

windows下nginx配置https证书
1、制作证书 1.1 安装工具openSSL。下载地址:http://slproweb.com/products/Win32OpenSSL.html Win64OpenSSL_Light-3_1_0.exe安装(假定安装位置在 d:\openSSL\) 1.2 配置openSSL环境。 新建系统变量OpenSSL值为d:\openSSL\bin,相…...

Llama改进之——RoPE旋转位置编码
引言 旋转位置编码(Rotary Position Embedding, RoPE)将绝对相对位置依赖纳入自注意力机制中,以增强Transformer架构的性能。目前很火的大模型LLaMA、QWen等都应用了旋转位置编码。 之前在[论文笔记]ROFORMER中对旋转位置编码的原始论文进行了解析,重点…...

Python的解析网页
课前案例 通过requests模块爬取指定网站中的图片并保存到本地目录中。 上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程): # target为目标函数;args中传入的是download函数的参数url threading.Threa…...

VBA技术资料MF159:实现某个区域内的数据滚动
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...