首页 > 编程语言 >C# 证件照替换底色与设置背景图---PaddleSegSharp

C# 证件照替换底色与设置背景图---PaddleSegSharp

时间:2024-05-29 18:44:12浏览次数:20  
标签:engine string using C# --- outfile PaddleSegSharp new png

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;
        #endregion


        public 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("Fing.jpg");
                        ////this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms); 
                        #endregion


                        backgroundImage = 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("Finge.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, "识别结果");
            //}
        }
    }
}

 

标签:engine,string,using,C#,---,outfile,PaddleSegSharp,new,png
From: https://www.cnblogs.com/1175429393wljblog/p/18220889

相关文章

  • celery包结构
    celery包结构的使用包结构如下项目名├──celery_task #celery包│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.pyapp文件必须在这里面创建出来│└──user_tasks.py#所有任......
  • 创建第一个vue项目(基于vue-cli脚手架)
    目录vue项目要求环境 创建第一个项目vue项目要求环境安装node.js(https://nodejs.org/en/)    测试node是否安装成功node-v   效果如下安装vue-cli(以下指令皆在cmd命令窗口输入)npminstall-g@vue/cli安装vue.js npminstallvue  ......
  • VSCode配置C++环境
    目录一.环境准备二.编写代码三.直接利用gcc以及gdb编译调试四.配置tasks.json和launch.json五.其他这篇文章讨论一下VSCode配置C++的方法,重点要讨论的是tasks.json和launch.json这两个配置文件,所以很多基础内容会直接略过。一.环境准备1.安装MinGW-w64。为啥要装Min......
  • Android 四大组件 service
    前言在Android系统中,Service是一个用来执行长时间运行的操作而不提供用户界面的应用组件。它可以在后台执行任务,即使用户切换到其他应用也不会被中断。Service在Android中主要用于在后台执行长时间运行的任务,例如播放音乐、执行文件下载、处理网络请求等。尽管Service运行......
  • 《用ChatGPT轻松搞定Java编程难题:从基础到复杂案例的全面解析》
    ChatGPT国内使用体验点击(文件中并非网站跳转而是详细教程):Docshttps://uajqbcov4oa.feishu.cn/docx/GmeGdznJkoc3nzxHECQcojZ9nXg?from=from_copylink随着人工智能技术的快速发展,越来越多的开发者开始使用ChatGPT来辅助解决编程中的问题。ChatGPT不仅可以快速生成代码,还能进行......
  • Mathematics
    数学,西文叫\(\mathbf{mathematics}\),来自希腊语,它的意思是聪明人,聪明的,聪明人干的事。如果一个人什么都会的话,我们就叫他\(\mathbf{polymath}\)(博学家)。数学的描述对象:数、形、形式、集合等。物理学正确与否的问题,一定是通过通过现实世界的观察,只有被观察到了,或者被验证了的时......
  • celery定时任务
    注意:不论是定时任务,还是普非定时任务,都需要启动worker,别忘记。(〃>目<)老方法#1配置文件celery.py中不是settings.py中!!!#时区app.conf.timezone='Asia/Shanghai'#是否使用UTCapp.conf.enable_utc=False#任务的定时配置fromdatetimeimporttimedeltafromcel......
  • celery官方解决方案(基于django新)
    使用官方方案之前,先看看目录结构。luffy_api/__init__.pycelery.pysettings.pyurls.pywsgi.pymyapp/__init__.pytasks.py#也就是放在项目名称同名的内部文件夹下(和settings)同名#必须是这样的结构。第一步安装必要的模块......
  • celery通用解决方案(基于django老)
    通用方案移动项目celery_task到项目根目录在视图中写逻辑启动worker-->celery-Acelery_taskworker-ldebug-Peventlet运行django,正常使用接口#1把之前的celery_task移动过到项目根路径,然后开启worker#2在视图函数中提交任务#fromlibs.tx_smsimportg......
  • 初始celery
    使用celery前的一些注意事项res=add.delay(x,y)print(res.id)#这个id才是真正的任务id#安装pipinstallcelery#安装redis(消息队列和结果存储使用redis)pipinstallredis#windows安装,mac和Linux不需要安装下面的包pipinstalleventlet#官网解释#Celeryi......