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%,那么也就是…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...