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/ 后感觉百度的差距太大了。就无语了。
c# 利用百度图像处理【人像分割】一键抠图的更多相关文章
- 利用百度API Store接口进行火车票查询
火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...
- 利用百度语音API进行语音识别。
由于项目需要,这几天都在试图利用百度语音API进行语音识别.但是识别到的都是“啊,哦”什么的,我就哭了. 这里我只是分享一下这个过程,错误感觉出现在Post语音数据那一块,可能是转换问题吧. API请 ...
- 利用百度词典API和Volley网络库开发的android词典应用
关于百度词典API的说明,地址在这里:百度词典API介绍 关于android网络库Volley的介绍说明,地址在这里:Android网络通信库Volley 首先我们看下大体的界面布局!
- 利用百度地图API,获取经纬度坐标
利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?&quo ...
- 利用百度地图API和群蚁算法,对TSP问题进行模拟与求解
前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上 ...
- 利用百度接口进行人脸识别并保存人脸jpg文件
利用百度接口进行人脸识别,根据返回的人脸location用opencv切割保存. # coding : UTF-8 from aip import AipFace import cv2 import ...
- SEO如何利用百度知道日引流上千IP
个人小站长.SEO们经常为网站没有流量而发愁,一个没有流量的网站就像一个不喝水的人,迟早得死.没有流量,就没有PV,也就是说你的网站只是 给你一个人看的,那做站有什么意义呢?网站上所发布的内容都是分享 ...
- 利用百度翻译API,获取翻译结果
利用百度翻译API,获取翻译结果 translate.py #!/usr/bin/python #-*- coding:utf-8 -*- import sys reload(sys) sys.set ...
随机推荐
- 章节四、3-While循环-DoWhile语句
一.while死循环 package introduction5; public class WhileDemo { public static void main(String[] args) { ...
- 使用Fraps获取3D程序的FPS
Fraps为免费软件(wiki),通过Hook OpenGL(SwapBuffer)或D3D(Present)来获取目标进程的FPS信息(32位进程注入fraps32.dll,64位注入fraps64 ...
- Linux 网卡聚合
Linux 网卡聚合的类型: 1.broadcast:传输来自所有端口的每个包 2.roundrobin:以轮播方式传输来自每个端口的包 3.activebackup:故障转移运行程序,监视更改并选择 ...
- 如何在HTTP客户端与服务器端之间保持状态(转)
HTTP协议与状态保持 HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都 ...
- c# 建立到数据源的连接 以及获取项目配置文件的属性
两种连接数据库的写法: <connectionStrings> <add name="HRModelsContainer" connectionString=&q ...
- Q2Day81
性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...
- 【公众号系列】SAP S/4 HANA 1809请查收
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP S/4 HANA 1809 ...
- JaveScript 中的正则表达式
1.语法: var expression = /pattern/flags ; pattern: 任何简单或复杂的正则表达式. flags: 可以是 g,i,m 或它们的组合. ...
- eclipse版本对应名称以及下载地址
Eclipse 1.0 2001年11月7日(Win32/Linux32 Motif) Eclipse 2.0 2002年6月27日(Linux32 Motif ...
- [HBase_1] HBase安装与配置
0. 说明 1. 简介 1.1 简介 基于 HDFS 的大表软件(实时数据库) 十亿行 x 百万列 x 上千个版本 版本是通过 mvcc 技术控制:multiple version concurren ...