zoukankan      html  css  js  c++  java
  • c# 利用百度图像处理【人像分割】一键抠图

    百度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:Class="IDPhoto.MainWindow"
            Title="MainWindow" Height="1301" Width="1126">
        <Grid x:Name="gridMain" AllowDrop="True"  Background="Gray" IsHitTestVisible="True"
              PreviewDragOver="TextBox_PreviewDragOver" PreviewDrop="TextBox_PreviewDrop">
    
    
            <Button Content="btnStart" Height="41" HorizontalAlignment="Left" Margin="25,27,0,0" x:Name="btnDoWork" VerticalAlignment="Top" Width="250" Click="btnDoWork_Click" />
            <Border Background="#FF1133A6" BorderBrush="WhiteSmoke" BorderThickness="5"  Width="432" Height="502" 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" Height="100" Margin="366,219,0,0" VerticalAlignment="Top" Width="100"/>
        </Grid>
    </Window>
    

      

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

  • 相关阅读:
    Fiddler: Creation of interception certificate failed.
    ip地址检查正则表达式 兼容ipv4,ipv6
    母版页与子页的启动过程
    erlang 读取confg文件异常 could not start kernel pid error in config file
    转义字符 显示形式 转换成 实际形式 \\n to \n
    How to use epoll? A complete example in C
    Lex & Flex 词法分析器实践(未完,持续更新)
    我理解的爱情———柳智宇 (转载)
    Learning by doing 系列文章概述
    锁与RCU数据共享机制
  • 原文地址:https://www.cnblogs.com/wgscd/p/10544576.html
Copyright © 2011-2022 走看看