UnityC#接阿里云头像自动分割API

使用阿里云API实现任一图片(人像)对头部进行图片分割,然后将分割后的图片与其他图片叠加,实现换头功能;(虽然越玩越坏,但也挡不住继续学习的心,写完这个继续捣鼓OpenCV);
1:获取摄像头图像,然后进行截图:
********此处为打开摄像头

    private WebCamTexture webCamTexture;//摄像头的内容 
    private UnityEngine.UI.RawImage showrawImage; 
    void Start()
    { 
        //打开了摄像头
        WebCamDevice[] devices = WebCamTexture.devices;
        string deviceName = devices[0].name;
        webCamTexture = new WebCamTexture(deviceName, 400, 300);
        // GetComponent<Renderer>().material.mainTexture = webCamTexture;
        showrawImage.texture = webCamTexture;
        webCamTexture.Play();  
    } 

*****这里获取截图

 //截图屏幕
            var texture = ScreenCapture.CaptureScreenshotAsTexture();

2:图片转换为Base64字符串;方法如下:

  /// <summary>
    /// 图片转换为Base64字符
    /// </summary>
    /// <param name="texture2D"></param>
    /// <returns></returns>
    public static string ImgToBase64String(Texture2D texture2D)
    {
        byte[] buffer = GetBytesFromTexture(texture2D); 
        string base64String = Convert.ToBase64String(buffer); 
        return base64String;
    }
    /// <summary>
    /// 图片转换为byte数据
    /// </summary>
    /// <param name="texture2D"></param>
    /// <returns></returns>
    public static byte[] GetBytesFromTexture(Texture2D texture2D)
    {
        RenderTexture renderTex = RenderTexture.GetTemporary(
                    texture2D.width,
                    texture2D.height,
                    0,
                    RenderTextureFormat.Default,
                    RenderTextureReadWrite.Linear);

        Graphics.Blit(texture2D, renderTex);
        RenderTexture previous = RenderTexture.active;
        RenderTexture.active = renderTex;
        Texture2D readableText = new Texture2D(texture2D.width, texture2D.height);
        readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
        readableText.Apply(); 
        byte[] bytes = readableText.EncodeToJPG();
        return bytes; 
    } 

3:注册阿里云账户并登录,然后输入:头像自动分割(抠头像)进入到服务购买页面,现在是有免费套餐20次调用的机会,赶紧购买体验把(反正不要钱),这里是APICode查看地址。然后点击下面的API接口,根据自己的需求选择功能,这里选择:人体头部抠图返回透明背景,然后根据需求更改,这里使用UnityC#脚本更改如下:

 ALI_API_Result APIStart()
    {

        if (0 < querys.Length)
        {
            url = url + "?" + querys;
        }

        if (host.Contains("https://"))
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            httpRequest = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
        }
        else
        {
            httpRequest = (HttpWebRequest)WebRequest.Create(url);
        }
        httpRequest.Method = method;
        httpRequest.Headers.Add("Authorization", "APPCODE " + appcode);
        //根据API的要求,定义相对应的Content-Type
        httpRequest.ContentType = "application/json; charset=UTF-8";
        if (0 < bodys.Length)
        {
            byte[] data = Encoding.UTF8.GetBytes(bodys);
            using (Stream stream = httpRequest.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }
        }
        try
        {
            httpResponse = (HttpWebResponse)httpRequest.GetResponse();
        }
        catch (WebException ex)
        {
            httpResponse = (HttpWebResponse)ex.Response;
        } 
        Stream st = httpResponse.GetResponseStream();
        StreamReader reader = new StreamReader(st, Encoding.GetEncoding("utf-8")); 
        string jsondata = reader.ReadToEnd();
        print(jsondata);
        ALI_API_Result aLI_API_Result = JsonConvert.DeserializeObject<ALI_API_Result>(jsondata);
        return aLI_API_Result;
    }

    public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true;
    }

************根据阿里云API需要的Json对象进行封装

public class ALI_AI_API 
{
    public string type;  //#图片类型,目前支持\"jpg\"和\"png\"两种类型
    public string photo;//\"图片数据BASE64编码\"
    public ALI_AI_API(string typePhoto,string photoBASE64) 
    {
        type=typePhoto;
        photo=photoBASE64;
    }
}
public class ALI_API_Result 
{
    public int status;
    public float time; 
    public string errmsg;
    public string error;
    public ALI_API_PhotoData data;
}
public class ALI_API_PhotoData
{
    public string result;
    public float[] size;
}

4:然后就是根据获取的图片进行API请求然后接收返回数据进行显示:
在这里插入图片描述

    /// <summary>
    /// 直接调用或者按钮监听
    /// </summary>
    private void GetRequestAli_Api() 
    {
        var texture = ScreenCapture.CaptureScreenshotAsTexture();
        ALI_AI_API = new ALI_AI_API("png", GameUtils.ImgToBase64String(texture));
        // ALI_AI_API = new ALI_AI_API("png", GameUtils.ImgToBase64String(imagurl1));
        //转换为Base64字符串
        bodys = JsonConvert.SerializeObject(ALI_AI_API);
        //获取阿里云结果
        ALI_API_Result aLI_API_Result = APIStart();
        if (aLI_API_Result != null && aLI_API_Result.status == 0)
        {//showImage自己定义一个Image组件  public UnityEngine.UI.Image showImage;
            StartCoroutine(DownloadImage(aLI_API_Result.data.result, showImage));
        }
    }
    /// <summary>
    /// 获取图片
    /// </summary>
    /// <param name="url"></param>
    /// <param name="showImage"></param>
    /// <returns></returns>
   IEnumerator DownloadImage(string url, UnityEngine.UI.Image showImage)
    {

        UnityEngine.Networking.UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else
        {
            Texture2D myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
            Sprite  sprite = Sprite.Create(myTexture, new Rect(0, 0, myTexture.width, myTexture.height), new Vector2(0, 0));
            showImage.sprite = sprite;
            showImage.SetNativeSize();
        }
    } 
    /// <summary>
    /// 复制的阿里云API更改了一下
    /// </summary>
    /// <returns></returns>
    ALI_API_Result APIStart()
    {

        if (0 < querys.Length)
        {
            url = url + "?" + querys;
        }

        if (host.Contains("https://"))
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            httpRequest = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
        }
        else
        {
            httpRequest = (HttpWebRequest)WebRequest.Create(url);
        }
        httpRequest.Method = method;
        httpRequest.Headers.Add("Authorization", "APPCODE " + appcode);
        //根据API的要求,定义相对应的Content-Type
        httpRequest.ContentType = "application/json; charset=UTF-8";
        if (0 < bodys.Length)
        {
            byte[] data = Encoding.UTF8.GetBytes(bodys);
            using (Stream stream = httpRequest.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }
        }
        try
        {
            httpResponse = (HttpWebResponse)httpRequest.GetResponse();
        }
        catch (WebException ex)
        {
            httpResponse = (HttpWebResponse)ex.Response;
        } 
        Stream st = httpResponse.GetResponseStream();
        StreamReader reader = new StreamReader(st, Encoding.GetEncoding("utf-8")); 
        string jsondata = reader.ReadToEnd();
        print(jsondata);
        ALI_API_Result aLI_API_Result = JsonConvert.DeserializeObject<ALI_API_Result>(jsondata);
        return aLI_API_Result;
    }

    public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true;
    }

效果就是扣去相片中的头部不含颈部图片。。。之前上传了图片,被识别为违规。。。。。太坑了!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有点朦

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值