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