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