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

相关推荐

  1. C# 证件替换底色设置背景---PaddleSegSharp

    2024-06-07 11:28:07       9 阅读
  2. opencv对图片更换背景底色

    2024-06-07 11:28:07       15 阅读
  3. css设置背景 路径带括号 不显示问题

    2024-06-07 11:28:07       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 11:28:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 11:28:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 11:28:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 11:28:07       18 阅读

热门阅读

  1. 详解MySQL的间隙锁

    2024-06-07 11:28:07       9 阅读
  2. mm-qcamera-daemon主函数分析

    2024-06-07 11:28:07       7 阅读
  3. Mysql基础进阶速成版

    2024-06-07 11:28:07       7 阅读
  4. 在 Vue 中实现算法可视化

    2024-06-07 11:28:07       9 阅读
  5. Elixir学习笔记——关键字列表和映射

    2024-06-07 11:28:07       8 阅读
  6. SwiftUI二列表和导航

    2024-06-07 11:28:07       7 阅读
  7. c++“二纯” 纯虚函数和纯虚析构

    2024-06-07 11:28:07       10 阅读
  8. 2024-06-07 问AI: LLM tokenizer 是什么?

    2024-06-07 11:28:07       8 阅读