c# 利用百度图像处理【人像分割】一键抠图

摘要:
access_token=“+Common.token,sPost);/*{“log_id”:39922782674564717,“前台”:“iVBORw0KGgoAAAANSUhEUgAAA0gAAAIMCAYAAADPWYwVAA*/JTokenjt=JToken.Parse(sResult);stringsBase64=”“+jt[”前台“];Dispatcher.Invoke(newAction(()=˃{if(sBase64!

百度AI开放平台-人像分割: http://ai.baidu.com/tech/body/seg

注意本文后面的话,百度这个技术效果太差劲了,国外这 https://www.remove.bg/ 个比百度强大很多。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using Newtonsoft.Json;
using System.Web;
using Newtonsoft.Json.Linq;
using System.ComponentModel;


namespace IDPhoto
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainWindow_Loaded);
             worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
     

        }

        string strImageBase64 = "";
        BackgroundWorker worker;
        object lockObj = new object();
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          
            btnDoWork.IsEnabled = true;
            btnDoWork.Visibility = System.Windows.Visibility.Collapsed;
            loading.Visibility = Visibility.Collapsed;
        }




        void worker_DoWork(object sender, DoWorkEventArgs e)
        {

            if (Common.token == "")
            {
                Common.token = getAccessToken();
                Config.SaveConfig();
            }


            string sPost = "image=" + HttpUtility.UrlEncode(strImageBase64, Encoding.UTF8) + "&type=foreground";
            string sResult = HttpHelper.httpPost("https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token=" + Common.token, sPost);
            /*
             {"log_id": 3992278826748564717, "foreground": "iVBORw0KGgoAAAANSUhEUgAAA0gAAAIMCAYAAADPWYwVAA
             */
            JToken jt = JToken.Parse(sResult);
            string sBase64 = "" + jt["foreground"];
            Dispatcher.Invoke(new Action(() =>
            {
               if (sBase64 != "")
            {
                parseImageFromBase64(sBase64);
            }
            else
            {

                MessageBox.Show(sResult);
            }

            }));



        }

       
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Config.loadConfig();//主要是加载保存的token,以免多少调用,token能有1个月左右的游戏时间

        }


//拖放文件支持的方法:TextBox_PreviewDragOver和TextBox_PreviewDrop


        private void TextBox_PreviewDragOver(object sender, DragEventArgs e)
        {

            e.Effects = DragDropEffects.Copy;
            e.Handled = true;
        }

        private void TextBox_PreviewDrop(object sender, DragEventArgs e)
        {

            if (worker.IsBusy) return;
           string  sSelectFile = "";
            foreach (string f in (string[])e.Data.GetData(DataFormats.FileDrop))
            {

                if (f.ToLower().EndsWith(".png") || f.ToLower().EndsWith(".jpg") || f.ToLower().EndsWith(".bmp"))
                {
                  Title = sSelectFile=f;
                }
               
            }
            if (sSelectFile == "")
            {
                return;
            }
            else {
               
                ProcessImage(sSelectFile);
            
            
            }


        }



        private void ProcessImage(string sFile) {

            loading.Visibility = Visibility.Visible;
           byte[] buffer=   File.ReadAllBytes(sFile);
           strImageBase64 = Convert.ToBase64String(buffer);//Properties.Resources.testImgData;
           btnDoWork.IsEnabled = false;
           worker.RunWorkerAsync();

        }



        private void btnDoWork_Click(object sender, RoutedEventArgs e)
        {

            if (worker.IsBusy) return;
            System.Windows.Forms.OpenFileDialog dlg = new  System.Windows.Forms.OpenFileDialog ();
            dlg.Filter = "图片文件|*.jpg;*.png;*.bmp";
            if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) {

                return;
            }

            ProcessImage(dlg.FileName);

       }



///Base64 string 转 BitmapImage 
        void parseImageFromBase64(string sBase64)
        {


            char[] c = sBase64.ToCharArray();// Properties.Resources.testImgData .ToCharArray();
            byte[] buffer = System.Convert.FromBase64CharArray(c, 0, c.Length);
            MemoryStream m = new MemoryStream(buffer);
            m.Position = 0;
            BitmapImage bmp = new BitmapImage();
            bmp.BeginInit();
            bmp.StreamSource = m;
            bmp.EndInit();
            image1.Source = null;
            image1.Source = bmp;


        }


///获取TOKEN ,参数client_id和client_secret在百度自己的后台APP的key和secret
        string getAccessToken()
        {

            string s = HttpHelper.httpPost("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxxxxx&client_secret=xxxxxxxxxx", "");

            BaiduTokenData d = JsonConvert.DeserializeObject<BaiduTokenData>(s);
            if (d != null)
            {

                return d.access_token;
            }

            return "";


        }
        void testDemo()
        {


            string s = Uri.UnescapeDataString("data:image/jpeg;base64," + Properties.Resources.testImgData);

            string s2 = HttpHelper.httpPost("http://ai.baidu.com/aidemo", "image=" + s + "&image_url=&type=body_seg");
            Title = s2;



        }

    }





    public class BaiduTokenData
    {
        /// <summary>
        /// 
        /// </summary>
        public string refresh_token { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public int expires_in { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string session_key { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string access_token { get; set; }
        /// <summary>
        /// brain_body_seg public brain_all_scope vis-faceverify_faceverify_h5-face-liveness brain_body_analysis brain_body_attr vis-faceverify_FACE_V3 brain_gesture_detect wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test权限 vis-classify_flower lpq_开放 cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi
        /// </summary>
        public string scope { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string session_secret { get; set; }
    }











}




---------------------------------------------------
以下是HttpHelper 类代码:
---------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Windows;

namespace IDPhoto
{
   public  class HttpHelper
    {

      
       public static   CookieContainer myCookieContainer = new CookieContainer();
       private static string myReferer = "http://ai.baidu.com/tech/body/seg";
       public static bool checkLogin()
       {

           string s = "";
           bool loginOK = false;
           try
           {
               loginOK = s.Contains("sso_login_status=1");
               if (loginOK)
               {
                   Common.cookie = s;
                   setCookieContainer(s, new Uri("http://love.163.com/home?ydMobilePassport=false&ydMobile=0", UriKind.Absolute));
               }
               //  MessageBox.Show(s);
           }
           catch (Exception ex)
           {
               MessageBox.Show("" + ex.Message);
               return false;
           }

           return loginOK;
       }


        public   static  void setCookieContainer  (string cookie ,Uri url)
        {
           
            string[] arrCookie = cookie.Split(';');
            myCookieContainer = new CookieContainer();    //加载Cookie
            foreach (string sCookie in arrCookie)
            {
                myCookieContainer.SetCookies(url, sCookie);
            }



        }

      public static   string httpGet(string sUrl)
        {

            string s = "";
            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("" + sUrl);
                req.CookieContainer = myCookieContainer;
                req.Referer = myReferer;
                // req.TransferEncoding = "UTF8";
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                myCookieContainer.Add(resp.Cookies);
                StreamReader r = new StreamReader(resp.GetResponseStream());
                s = r.ReadToEnd();
                r.Close();
                resp.Close();
            }
            catch (Exception ex)
            {

                s = ex.Message;

            }
            return s;



        }


      public static string httpPost(string sUrl,string para)
      {

          string s = "";
          try
          {  
              byte[] data = Encoding.ASCII.GetBytes(para);
              HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("" + sUrl);
              req.CookieContainer = myCookieContainer;
             // req.Headers.Add("Cookie",Properties.Resources.cookie);
              req.Referer = myReferer;
              req.ContentType = "application/x-www-form-urlencoded";
              // req.TransferEncoding = "UTF8";
               req.Method = "POST";
               if (para != "")
               {
                   req.ContentLength = data.Length;
                   req.GetRequestStream().Write(data, 0, data.Length);
               }
              HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
              myCookieContainer.Add(resp.Cookies);
              StreamReader r = new StreamReader(resp.GetResponseStream());
              s = r.ReadToEnd();
              r.Close();
              resp.Close();
          }
          catch (Exception ex)
          {

              s = ex.Message;

          }
          return s;



      }







    }




   public class Common {

       public static string cookie { get; set; }


       public static string token { get; set; }
   }

}

  

UI 代码:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:IDPhoto" x: 
        Title="MainWindow"   Width="1126">
    <Grid x:Name="gridMain" AllowDrop="True"  Background="Gray" IsHitTestVisible="True"
          PreviewDragOver="TextBox_PreviewDragOver" PreviewDrop="TextBox_PreviewDrop">


        <Button Content="btnStart"   HorizontalAlignment="Left" Margin="25,27,0,0" x:Name="btnDoWork" VerticalAlignment="Top"   Click="btnDoWork_Click" />
        <Border Background="#FF1133A6" BorderBrush="WhiteSmoke" BorderThickness="5"      VerticalAlignment="Top"  HorizontalAlignment="Left" Margin="25,101,0,0" >
            <Image x:Name="image1" Stretch="Fill"  />
        </Border>
        <local:Loading x:Name="loading" Visibility="Collapsed" HorizontalAlignment="Left"   Margin="366,219,0,0" VerticalAlignment="Top"  />
    </Grid>
</Window>

  

后面的话:本来打算做个APP或Windows应用什么的,可惜后面对比了国外这个 https://www.remove.bg/ 后感觉百度的差距太大了。就无语了。

免责声明:文章转载自《c# 利用百度图像处理【人像分割】一键抠图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇星球大战 BZOJ 1015入门&amp;amp;常量&amp;amp;变量下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP

1、记住这个单词的意思:Interception(拦截) 2、首先说一下原理和背景   原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索。   目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代码里面不掺杂其它功能,比如:记录异常、记录操作日志。   背景:项目基本功能已完成,产品要求记录用户的操作日志,新增的时候记录某人在某时做了某事(包括...

快学Scala-04-函数和数组

1.函数的定义形式 def add([参数:类型])[返回类型][=]{方法体} 注意:方法体的return 不是必须的,最后一句默认返回 方法体的花括号可以没有 总之 可以没有参数,没有返回值,没有=号,没有花括号,没有return   def add(a:Int,b:Int):Int={ return a+b } def add(a:I...

Java中判断String不为空的问题性能比较

 function 1: 最多人使用的一个方法, 直观, 方便, 但效率很低. function 2: 比较字符串长度, 效率高, 是我知道的最好一个方法. function 3: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 不推荐使用    以下是三种方法在机器上的运行结果: (机器性能不一, 仅供参考) fu...

把页面的Table直接输出到Excel文件中

有个需求是统计的时候,为生成的html表格提供导出功能,但是这样导出Excel不会显示自身的表格 影响美观,但是excel会显示html的css样式,这里可以通过处理行对象的方式进行导出,但是处理起纵向合并比较麻烦,这里待续! 1 String newStr = new String(name.getBytes(), "ISO8859_1"); 2 res...

C# 安装WindowService服务和相关

https://www.cnblogs.com/charlie-chen2016/p/8031774.html 这是一个备份数据库的服务,逻辑很简单,就是通过定时器实现在特定的时间执行SQL语句备份数据库,并将每一步操作的情况写入日志文件。 usingSystem; usingSystem.Collections.Generic; usingSyst...

C#断开式连接

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Text;us...