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/ 后感觉百度的差距太大了。就无语了。

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/wgscd/p/10544576.html
Copyright © 2011-2022 走看看