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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值