当前位置: 首页 > news >正文

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, "识别结果");//}}}
}

相关文章:

  • adam优化器计算过程(tensorflow)
  • matlab工具使用记录-编辑器和命令行窗口分开还原
  • 理解 JavaScript 中的 `let` 和 `var` 区别
  • git分支开发主干合并流程
  • ElasticSearch操作之重置密码脚本
  • Pi 母公司将开发情感 AI 商业机器人;Meta 科学家:Sora 不是视频生成唯一方向丨RTE 开发者日报 Vol.214
  • C/C++语法|pthread线程库的使用
  • redis数据类型set,zset
  • Golang并发编程-协程goroutine的信道(channel)
  • 深入解析 JSONPath:从入门到精通
  • C#记录日志
  • Shell脚本的分支语句,循环语句
  • Vue 3 教程:核心知识
  • 29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP
  • 出现 java: Annotation processing is not supported for module cycles 解决方法
  • 网络传输文件的问题
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CentOS 7 防火墙操作
  • CSS3 变换
  •  D - 粉碎叛乱F - 其他起义
  • HTTP 简介
  • Java多线程(4):使用线程池执行定时任务
  • MD5加密原理解析及OC版原理实现
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP的类修饰符与访问修饰符
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 爱情 北京女病人
  • 给github项目添加CI badge
  • 力扣(LeetCode)21
  • 力扣(LeetCode)965
  • 前端路由实现-history
  • 前端性能优化--懒加载和预加载
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • Linux权限管理(week1_day5)--技术流ken
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​数据链路层——流量控制可靠传输机制 ​
  • # 数论-逆元
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $.each()与$(selector).each()
  • (¥1011)-(一千零一拾一元整)输出
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (7)摄像机和云台
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (全注解开发)学习Spring-MVC的第三天
  • (三)mysql_MYSQL(三)
  • (十七)Flink 容错机制
  • (学习日记)2024.01.19
  • (杂交版)植物大战僵尸
  • (转)jQuery 基础
  • (转)大型网站架构演变和知识体系