2018-08-06 18:05:23 abc1090275833 阅读数 869

       最近项目需要定位,所以开始来研究Unity的定位,本来想用原生的sdk,但是谷歌被墙了那就没有办法了,接第三方的sdk又太麻烦,百度了一下正好可以通过百度地图API来获取当前IP的地址,不仅是百度地图,同时高德地图,腾讯地图等等也都有类似的API,此次我选择了百度地图,于是在查询了百度地图的相关接口后研究出功能,自学记录一下

       代码如下:

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Net.NetworkInformation;


public class BaiduTest : MonoBehaviour {


    public Text province;
    public Text city;

    string url = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    string text;

    void Start()
    {
        StartCoroutine(Request());
    }

    // Update is called once per frame
    void Update()
    {

    }
    IEnumerator Request()
    {
        WWW www = new WWW(url);
        yield return www;

        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            ResponseBody req = JsonConvert.DeserializeObject<ResponseBody>(www.text);
            Debug.Log("夭寿啦,调到地址啦!!!!!!");
            Debug.Log(req.content.address_detail.city);
            province.text = req.content.address_detail.province;
            city.text = req.content.address_detail.city;
        }
    }

}

public class ResponseBody
{

    public string address;
    public Content content;
    public int status;

}

public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
    public Address_Detail(string city, int city_code, string district, string province, string street, string street_number)
    {
        this.city = city;
        this.city_code = city_code;
        this.district = district;
        this.province = province;
        this.street = street;
        this.street_number = street_number;
    }
}
public class Point
{
    public string x;
    public string y;
    public Point(string x, string y)
    {
        this.x = x;
        this.y = y;
    }
}

 

       需要注意的是,需要引入Json解析,刚好有现成的插件,导入进去运行成功,不过稍有遗憾的是,我只定位到了省份和城市,不知道是不是IP的问题,通过此API调用IP地址的话精度不是太高,如果需要精度很高的定位的话,建议还是安装第三方SDK,调用的网址是"http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";  需要替换自己的AK的话将其中的bretF4dm6W5gqjQAXuvP0NXW6FeesRXb替换成自己的就可以了,具体调用百度地图API有详细解释,在这里就不多做介绍了,下面是我的工程文件,unity版本为5.3.6,在Editor和Android环境下都可以正常运行调用,里面还有些获取IP和调用安卓的代码,在此就不做介绍了。

 

       最后放一下工程文件的链接:  https://download.csdn.net/download/abc1090275833/10586792

2018-06-15 04:25:44 sd_ck 阅读数 658

百度AI开放平台提供了人脸识别功能,可以通过官网进行申请



得以得到一个百度提供的人脸识别服务应用


点击管理可以找到SDK下载界面,在unity3d中使用c#进行脚本的编写,选择下载c#SDK


现在的SDK版本为3.5.1,下载后得到的文件结构是这样的






可以根据.net库的不同选择使用不同的动态链接库文件


在我首次使用百度人脸识别时SDK版本为3.3.1

文件结构如下


其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。 

解压后导入uinty3d项目中


导入时注意将第三方库文件一起导入


根据demo中给的程序进行学习使用


参考博客https://blog.csdn.net/dark00800/article/details/78191431后进行初步的使用


获取摄像头进行拍照,将照片上传给百度服务器得到返回结果,返回结果为json类型,解析后得到该照片中的人是否为库中所记录的成员,记录进入学习系统的学习者

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Collections.Generic;
using System;
using LitJson;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Text;

public class takePhoto : MonoBehaviour
{
    public string deviceName;//这个虽然public,但无需为其绑定变量,直接运行,默认调用,显示本地摄像机的名称
    //接收返回的图片数据  
    WebCamTexture tex;
    public UITexture QueryTex;
    public UILabel Msg;
    DateTime dt = DateTime.Now;
    public static string dateTime;
    public static string str;
    public static string imagePath;
    public static string isNewUser;
    public static bool isTrue;
    public static string oldUserID;

    void OnGUI()
    {
        if (tex != null)
        {
            //捕获截图大小               —距X左屏距离   |   距Y上屏距离    
            GUI.DrawTexture(new Rect(Screen.width / 2 - 150, Screen.height / 2 - 190, 280, 200), tex);
        }
    }

    private void Awake()
    {

        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
            delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors sslPolicyErrors)
            {
                return true;           // always accept
            };

    }
    // Use this for initialization
    void Start()
    {
        StartCoroutine(OpCarame());
        new GameObject().SetActive(false);
        QueryTex.gameObject.SetActive(true);

        Invoke("QueryLogin", 3);
    }
    void Update()
    {
        //tex.Pause();
        //StartCoroutine(getTexture());
    }


    void OPenCarame(GameObject obj)
    {
        StartCoroutine(OpCarame());
        //关闭按钮
        obj.SetActive(false);
        QueryTex.gameObject.SetActive(true);


    }
    void QueryLogin()
    {
        //捕获照片  
        tex.Pause();
        StartCoroutine(getTexture());
    }
    /// <summary>  
    /// 捕获窗口位置  
    /// </summary>  
    public IEnumerator OpCarame()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName = devices[0].name;
            tex = new WebCamTexture(deviceName, 300, 300, 12);
            tex.Play();
        }
    }
    /// <summary>  
    /// 获取截图  
    /// </summary>  
    /// <returns>The texture.</returns>  
    public IEnumerator getTexture()
    {
        yield return new WaitForEndOfFrame();
        Texture2D t = new Texture2D(400, 300);
        t.ReadPixels(new Rect(Screen.width / 2 - 200, Screen.height / 2 - 50, 360, 300), 0, 0, false);
        //距X左的距离        距Y屏上的距离  
        // t.ReadPixels(new Rect(220, 180, 200, 180), 0, 0, false);  
        t.Apply();
        byte[] byt = t.EncodeToPNG();
        //string path = Application.dataPath + "/Photoes/" + Time.time + ".jpg";
        string path = "E:\\项目文档\\1.jpg";
        File.WriteAllBytes(path, byt);
        IdentifyDemo(path);
    }

    public void IdentifyDemo(string imgPath)
    {
        print(imgPath);
        imagePath = imgPath;
        var groupId = "123";//组名
        var client = new Baidu.Aip.Face.Face("DnQ5npIM38mbAoelx81mnDkW", "kreCT0E3qnHfYPHKp9uVNkk9XdvFwrmv");//修改成自己的 key

        var image = File.ReadAllBytes(imgPath);
        // 调用人脸识别,可能会抛出网络等异常,请使用try/catch捕获
        //var result = client.Identify(groupId, image);
        //print(result);
        // 如果有可选参数
        var options = new Dictionary<string, object>{
        {"ext_fields", "faceliveness"}};
        // 带参数调用人脸识别
        try
        {
            var result2 = client.Identify(groupId, image, options);


            decimal score = Convert.ToDecimal(result2["result"][0]["scores"][0]);
            //print(result2);
            //str = (string)result2["result_num"];
            //int i = Int32.Parse(str);
            //i++;
            dateTime = dt.Year+""+ dt.Month + dt.Day + dt.Hour + dt.Minute + dt.Second;
            if (score > 80)
            {
                isNewUser = "false";
                //将是否是新用户写到文本中
                Stream stream = File.Open(@".\isNewUser.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                StreamWriter sw1 = new StreamWriter(stream, Encoding.Default);
                sw1.WriteLine(isNewUser);
                sw1.Flush();
                sw1.Close();
                isTrue = false;
                Msg.SetRect(Screen.width * 0.4f, Screen.height * 0.8f, 300, 60);
                Msg.text = "欢迎再次使用英语学习系统!";
                tex.Stop();//必须关闭摄像机
                Debug.Log(result2["result"]);
                String st = result2["result"].ToString();
                string[] sArray = st.Split('"');
                //Debug.Log(sArray[sArray.Length - 2]);
                Debug.Log(sArray[3]);
                oldUserID = sArray[3];
                SceneManager.LoadScene("star");
            }
            else
            {
                isTrue = true;
                isNewUser = "true";
                //将是否是新用户写到文本中
                Stream stream = File.Open(@".\isNewUser.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                StreamWriter sw1 = new StreamWriter(stream, Encoding.Default);
                sw1.WriteLine(isNewUser);
                sw1.Flush();
                sw1.Close();

                Msg.SetRect(Screen.width * 0.4f, Screen.height * 0.8f, 300, 60);
                Msg.text = "欢迎新用户使用英语学习系统!";
                client.UserAdd(dateTime, "", groupId, image, options);
                Invoke("MsgInfo", 2);
                //       Invoke("QueryLogin", 3);
                tex.Stop();//必须关闭摄像机
                SceneManager.LoadScene("star");
            }
        }
        catch
        {
            Msg.text = "登录失败!";
            Invoke("MsgInfo", 3);

        }
    }
    void MsgInfo()
    {
        Msg.text = "";
        tex.Play();
    }

}

2018-10-19 16:07:49 GottaYiWanLiu 阅读数 2981

本文将讲到,如何利用百度ai的人体分析sdk在unity中实现摄像头实时画面的手势识别

工程链接在文末

 

(本人使用的是unity2018,unity2017以上都可以,不然.NET版本不支持)

1.准备工作:首先在百度AI的官网,下载人体分析C# SDK

 

 

 

然后登陆控制台,新建一个人体分析的应用

然后你会获取到该应用的API_KEY和SECRET_KEY,后续开发需要使用

 

 

2.准备工作做完后,新建一个unity工程,在Asset下新建一个文件夹取名Plugins,将第一步下载的SDK中两个DLL文件复制进来

然后就可以编程了

 

 

 

代码很简单,注释也写的很清楚,我只讲下思路:

其实百度AI的SDK是只单纯的识别图片,而我们要做的识别摄像头实时画面中的手势,其实方法很简单

此时我们只需在固定时间截图摄像头画面就可以了,本文设定每两秒截一次图,然后调用SDK识别此图中的手势,就能实现我们所需要的实时画面中的手势

 

代码如下:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.BodyAnalysis;
using System.IO;
using UnityEngine.UI;

public class FaceDetect : MonoBehaviour
{
    public string app_id;
    public string api_key;
    public string secret_key;

    Body client;

    private string deviceName;
    private WebCamTexture webTex;

    //百度AI返回的结果数据
    public Text resultMsg;
    //提取其中的手势名称
    public Text detectedGestureMsg;



    void Awake()
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
               {
                   return true; // **** Always accept
               };
    }




    // Use this for initialization
    void Start()
    {
        api_key = "你自己的API_KEY";
        secret_key = "你自己的SECRET_KEY";
        StartCoroutine(CallCamera());
        client = new Body(api_key, secret_key);
        client.Timeout = 60000;  // 修改超时时间
    }

    // Update is called once per frame
    void Update()
    {
        CaptureScreen();
    }

    IEnumerator CallCamera()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName = devices[0].name;
            //设置摄像机摄像的区域    
            webTex = new WebCamTexture(deviceName, 1024, 768, 20);
            webTex.Play();//开始摄像    
            transform.GetComponent<RawImage>().texture = webTex;
        }
    }


    public float timer = 0;
    //截屏
    void CaptureScreen()
    {
        timer += Time.deltaTime;
        //每隔两秒检测一次
        if (timer > 2)
        {
            //删除上一次检测的图片
            File.Delete(Application.streamingAssetsPath + "/capture.jpg");
            CapturePhoto();
            timer = 0;
        }
    }
    public int width;
    public int height;
    //截图摄像头
    public Camera cameras;
    public string fileName;

    public void CapturePhoto()
    {
        Texture2D screenShot;
        RenderTexture rt = new RenderTexture(width, height, 1);
        cameras.targetTexture = rt;
        cameras.Render();
        RenderTexture.active = rt;
        screenShot = new Texture2D(width, height, TextureFormat.RGB24, false);
        screenShot.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        screenShot.Apply();

        //运行此行代码前,先手动在Asset路径下新建一个StreamingAsset文件夹
        fileName = Application.streamingAssetsPath + "/capture.jpg";
        // byte[] bytes = screenShot.EncodeToJPG();
      
        ScaleTextureCutOut(screenShot, 0, 0, 1024, 768);
        Debug.Log(string.Format("截屏了一张照片: {0}", fileName));
   
    }


    //切图

    byte[] ScaleTextureCutOut(Texture2D originalTexture, int pos_x, int pos_y, float originalWidth, float originalHeight)
    {
        Color[] pixels = new Color[(int)(originalWidth * originalHeight)];
        //要返回的新图
        Texture2D newTexture = new Texture2D(Mathf.CeilToInt(originalWidth), Mathf.CeilToInt(originalHeight));
        //批量获取点像素
        pixels = originalTexture.GetPixels(pos_x, pos_y, (int)originalWidth, (int)originalHeight);
        newTexture.SetPixels(pixels);
        newTexture.anisoLevel = 2;
        newTexture.Apply();
        //这一步把裁剪的新图片存下来
        byte[] jpgData = newTexture.EncodeToJPG();
        System.IO.File.WriteAllBytes(fileName, jpgData);
        GestureDemo(fileName);
        return jpgData;
    }



    public void GestureDemo(string filesPath)
    {
        var image = File.ReadAllBytes(filesPath);
        try
        {
            var result = client.Gesture(image);
            resultMsg.text = result.ToString();
            string[] msgArr = resultMsg.text.Split(',');
            //单独提取classname
            for (int i = 0; i < msgArr.Length; i++)
            {
                if (msgArr[i].Contains("classname"))
                {
                    string[] strArr = msgArr[i].Split(':');
                    detectedGestureMsg.text = strArr[1];
                    break;
                }
            }
        }
        catch (System.Exception)
        {
            throw;
        }
        

    }
}

 

工程结构如下:

 

 

运行前记得填写自己的API_KEY和SECRET_KEY

 

 

工程链接:

链接:https://pan.baidu.com/s/1CbGjzRHHVnt5UZ2rrGdCdQ 
提取码:nu3y

2016-08-10 10:07:54 ziguang111 阅读数 4307

公司要求要让一款IOS平台的一款手机游戏实现语言本地化,也就是让游戏里面的UI界面和文字等等随着IOS系统语言设置的改变从而变成相应语言的设置,因为公司就我一个unity3d人员,我只好闭门造车了,百度了很多,发现都是在Xcode上写OC语言,可是我不会,无意间翻找API文档发现了Application.systemLanguage 系统语言



于是我就想到了该怎么办,虽然比较蠢但是解决了我的问题,下面开始放代码
写了一个方法,方便调用
	void LanguageOfTitlelogo(){
		//获取系统当前的语言,在IOS获取的语言中,简体中文为“ChineseSimplified”和“Chinese”因为ios系统在9.0版本对系统语言进行过改动,为了满足以前版本和现在版本,写了两个
		//通过获取不同的语言,来替换语言不同的UI,从而到达语言本地化的要求
		if (Application.systemLanguage.ToString () == "ChineseSimplified"||Application.systemLanguage.ToString () == "Chinese") {
			
		
			titlelogo.GetComponent<Image> ().sprite = CNtitlelogo;

		} else {
			titlelogo.GetComponent<Image> ().sprite = ENtitlelogo;
		
		
		}
	}
 然后把这个方法放在Start或者awake里,这样每次进入游戏会直接替换相应的UI的图片,假如要换文字或者别的,我就不一一举例了
另外,PC端的中文为Chinese,英文为English,IOS端简体中文为Chinese或ChineseSimplified英文为English,安卓端没有试过,假如需要别的国家语言的反馈回来的信息,给大家提供一个代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;  

public class manager : MonoBehaviour {
	Text textlanguage;
	void Start(){
		textlanguage = GetComponent<Text> ();
		Debug.Log (Application.systemLanguage.ToString ());
		textlanguage.text = Application.systemLanguage.ToString ();//输出当前的系统语言

	}
}

建立UI-TEXT把这段代码挂在上面,PC端直接运行,安卓端和ios端导出来真机测试就行
写这个目的是抛砖引玉,我这个方法很简单,也很蠢,希望大家有好的方法可以分享一下。





2018-03-23 14:16:08 fcc7927752836 阅读数 228

Unity3D平台使用图片识别+语音合成技术的一个Demo

主要功能是通过手机摄像头获取拍摄画面,在通过图片识别解析图片中的字符,在通过语音合成将字符合成语音,最后播放出来

- 开发环境:

百度安卓API工程可用Android Studio直接打开,也可以直接使用编译好的DLL直接导入Unity3D,密码:sdgc

Unity3D工程,本人还在整理中,主要是写的太随意,等整理好会把完整工程献上


在想是不是可以录个视频,真不适合写东西~

百度翻译API

阅读数 288

【unity】API

阅读数 9

没有更多推荐了,返回首页