• 文字识别没那么难,因为我们有别人提供的API—————— 想做一个数字的识别,就研究了一下Face++的API 首先我们需要在Face++官网注册一个用户,网址https://www.faceplusplus.com.cn/ 注册完后我们就需要...
    文字识别没那么难,因为我们有别人提供的API——————


    想做一个数字的识别,就研究了一下Face++的API


    首先我们需要在Face++官网注册一个用户,网址https://www.faceplusplus.com.cn/


    注册完后我们就需要创建应用,以便于获取一个key值和secret值,这点是非常重要的,我们用的是试用版,正式的是需要收费的


    然后找到我们的控制台,查看相应的API吧,如图所示:


     



    这API里介绍的很详细,示例也很清楚。


    POST的请求,请求参数和返回值这两个是关键,请求参数就是我们访问他给的网址需要传递过去的参数,返回值就是识别后返回给我们的值,这里返回识别值是Unicode编码的,这里用因为返回的是json串,所以用引入litjson,解析一下就可以输出识别出的字了。


    如图是请求与返回参数:
     



    这里附上代码:


    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;
    using LitJson;
    using UnityEngine.UI;
     
    public class FaceTest1 : MonoBehaviour
    {
        public string ImageURL = "";
        //按钮上的文本
        public Text Btn_ShibieText;
        //显示结果
        public GameObject ShowResult;
     
        // Use this for initialization
        void Start()
        {
     
        }
     
        // Update is called once per frame
        void Update()
        {
     
        }
     
        public void TestHttpSend()
        {
            //识别文字
            WWWForm form = new WWWForm();
            form.AddField("api_key", "q8QTfr-xS5hm-i25JuWRLmWQQSHRRtzy");
            form.AddField("api_secret", "3JAabNdllrl-Dm_-iYSG43B0ewypFlWt");
            form.AddField("image_url", ImageURL);
            StartCoroutine(SendPost("https://api-cn.faceplusplus.com/imagepp/v1/recognizetext", form));
        }
        //提交数据进行识别
        IEnumerator SendPost(string _url, WWWForm _wForm)
        {
            WWW postData = new WWW(_url, _wForm);
            yield return postData;
            if (postData.error != "")
            {
                Debug.Log(postData.error);
                ShowResult.SetActive(true);
                Btn_ShibieText.text = "识别";
                ShowResult.transform.Find("Text").GetComponent<Text>().text = "识别失败!";
                GameObject.Find("DebugText").GetComponent<Text>().text = postData.error;
                //myTimer = 2.0f;
            }
            else
            {
                Btn_ShibieText.text = "识别";
                Debug.Log(postData.text);
                GameObject.Find("DebugText").GetComponent<Text>().text = postData.text;
                JsonJieXi(postData.text);
            }
        }
        void JsonJieXi(string str)
        {
            JsonData jd = JsonMapper.ToObject(str);
            Debug.Log(jd["result"].Count);
            for (int i = 0; i < jd["result"].Count; i++)
            {
                for (int j = 0; j < jd["result"][i]["child-objects"].Count; j++)
                {
                    Debug.Log(jd["result"][i]["child-objects"][j]["type"].ToString());
                    Debug.Log(jd["result"][i]["child-objects"][j]["value"].ToString());
                }
            }
        }
         
    }



    然后给大家看看面板是什么样子的,如图:
     



    有了面板和代码,大家应该就很清楚了。


    图片是访问的网络的,不过API里介绍有明确的图片各种限制和报错返回值的可能原因,大家可以根据原因来差错。

    我用的是这个图片,成功识别出,网址:
    如图:
     



    结果图:
     



    到此,简单的图片识别流程就OK了。不管是识别本地图片还是网络图片,根据API来就可以了。
    展开全文
  • 其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。1、下载人脸识别SDK首先我们需要下载最新版的SDK,打开人脸...

    百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。

    1、下载人脸识别SDK

    首先我们需要下载最新版的SDK,打开人脸识别SDK下载页面,选择C# SDK下载:
    SKD下载

    下载解压后得到一个叫aip-csharp-sdk-3.0.0的文件夹,其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。
    文件目录

    2、导入SDK

    由于SDK已经被打包成DLL文件,所以我们导入使用起来也十分方便,只需将解压后的文件夹直接导入到工程即可。当然为了方便管理我们可以将SDK导入到Plugins文件夹中,需要注意的是一定要讲第三方依赖一起导入不然会报错。
    Plugins目录

    导入后可能会有如下错误:
    .Net报错
    这是由于我们在Player设置中选择的Api Compatibility Level是.Net 2.0 Subset,即.Net 2.0的子集,这里需要改成.Net 2.0。选择Edit->Project Settings->Player,在Other Settings中将Api Compatibility Level更改为.Net 2.0:
    .Net2.0

    3、创建应用

    下面将以人脸检测为示例简单介绍一下SDK的使用。
    使用SDK前我们需要先注册一个百度账号,然后登陆百度AI开放平台,创建一个人脸识别应用。
    选择控制台并登录:
    选择控制台

    在控制台已开通服务中选择人脸识别:
    人脸识别

    然后点击创建应用,输入应用名,应用类型,接口选择(默认创建人脸识别的应用),和应用描述,点击立即创建,创建完毕后点击查看应用详情查看API Key和Secret Key(点击显示查看)
    创建应用

    完成创建

    应用详情

    之后可以选择监控报表来查看应用接口调用情况:
    监控报表

    4、接口调用

    百度AI开放平台提供了人脸识别C#版的详细技术文档,下面以实例来进行简单的调用说明。
    使用人脸检测功能我们添加Baidu.Aip.Face命名空间,定义一个Face变量用于调用API:

    using Baidu.Aip.Face;
    
    private Face client;
    
    client = new Face("API Key", "Secret Key")

    实例化Face变量时需要填写我们创建的应用的API Key和Secret Key,可以在应用详情中查看。
    进行人脸检测时调用FaceDetect方法:

    public JObject FaceDetect(byte[] image, Dictionary<string, object> options = null);

    该方法需要传入两个参数,被检测的图片和返回的参数配置,其中可选参数options可以使用默认值null,这时只会返回人脸的位置等基本信息。返回值是一个JObject类型,此类型是第三方依赖中提供的一个json类型。详细调用方法为:

    byte[] image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
    Dictionary<string, object> options = new Dictionary<string, object>()
    {
        {"face_fields", "beauty,age,expression,gender" }
    };
    client.FaceDetect(image, options);

    options中的face_fields为请求的参数,类型是string,多个项以逗号分开,不能加在逗号和后一项之间加空格,否则无效。详细参数如下表:

    参数 类型 描述
    face_fields string 包括age、beauty、expression、faceshape、gender、gla-sses、landmark、race、qualities信息,逗号分隔,默认只返回人脸框、概率和旋转角度。
    max_face_num number 最多处理人脸数目,默认值1
    image byte[] 图像数据

    方法返回的JObject包含一个或多个人脸的信息,也可以如下调用:

    client.FaceDetect(image);

    此时将只会返回最基本的信息,包括日志id,人脸数目,人脸位置,人脸置信度,竖直方向转角,三维左右旋转角,三维俯仰角,平面旋转角。
    所有返回值见下表:

    参数 类型 是否一定输出 描述
    log_id number 日志id
    result_num number 人脸数目
    result array 人脸属性对象的集合
    +age number 年龄。face_fields包含age时返回
    +beauty number 美丑打分,范围0-1,越大表示越美。face_fields包含beauty时返回
    +location array 人脸在图片中的位置
    ++left number 人脸区域离左边界的距离
    ++top number 人脸区域离上边界的距离
    ++width number 人脸区域的宽度
    ++height number 人脸区域的高度
    +face_probability number 人脸置信度,范围0-1
    +rotation_angle number 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
    +yaw number
    +pitch number 三维旋转之俯仰角度[-90(上), 90(下)]
    +roll number 平面内旋转角[-180(逆时针), 180(顺时针)]
    +expression number 表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回
    +expression_probability number 表情置信度,范围0~1。face_fields包含expression时返回
    +faceshape array 脸型置信度。face_fields包含faceshape时返回
    ++type string 脸型:square/triangle/oval/heart/round
    ++probability number 置信度:0~1
    +gender string male、female。face_fields包含gender时返回
    +gender_probability number 性别置信度,范围0~1。face_fields包含gender时返回
    +glasses number 是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回
    +glasses_probability number 眼镜置信度,范围0~1。face_fields包含glasses时返回
    +landmark array 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回
    ++x number x坐标
    ++y number y坐标
    +landmark72 array 72个特征点位置,示例图 。face_fields包含landmark时返回
    ++x number x坐标
    ++y number y坐标
    +race string yellow、white、black、arabs。face_fields包含race时返回
    +race_probability number 人种置信度,范围0~1。face_fields包含race时返回
    +qualities array 人脸质量信息。face_fields包含qualities时返回
    ++occlusion array 人脸各部分遮挡的概率, [0, 1] (待上线)
    +++left_eye number 左眼
    +++right_eye number 右眼
    +++nose number 鼻子
    +++mouth number
    +++left_cheek number 左脸颊
    +++right_cheek number 右脸颊
    +++chin number 下巴
    ++type array 真实人脸/卡通人脸置信度
    +++human number 真实人脸置信度,[0, 1]
    +++cartoon number 卡通人脸置信度,[0, 1]

    运行时可能会报错:
    运行报错
    这是网页端身份安全验证失败导致的,我们需要在程序运行时手动添加安全证书,在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
                    };

    我们可以用Text控件来查看具体的返回值:
    TestFace.cs:

    using System.Collections.Generic;
    using System.IO;
    using Baidu.Aip.Face;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class TestFace : MonoBehaviour
    {
    
        public Text debugInfo;
    
        private Face client;
        private byte[] image;
        private Dictionary<string, object> options;
    
        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
                };
    
            client = new Face("API Key", "Secret Key");
            image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
            options = new Dictionary<string, object>()
            {
                {"face_fields", "beauty,age,expression,gender" }
            };
        }
    
        public void StartDetect()
        {
            var result = client.FaceDetect(image);//, options);
            debugInfo.text = result.ToString();
        }
    }

    运行结果:
    运行结果

    By:蒋志杰

    展开全文
  • 本文将讲到,如何利用百度ai的人体分析sdk在unity中实现摄像头实时画面的手势识别 工程链接在文末   (本人使用的是unity2018,unity2017以上都可以,不然.NET版本不支持) 1.准备工作:首先在百度AI的官网,...

    本文将讲到,如何利用百度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

    展开全文
  • 上一篇文章介绍了在Unity3d中使用百度AI人脸识别功能,本文将用一个描绘人脸特征点的程序来讲解对SDK的调用。首先我们需要搭建一个简单的场景:一个开始测试的按钮,一张供测试和绘制特征点的图片,和显示debug信息...

    上一篇文章介绍了在Unity3d中使用百度AI人脸识别功能,本文将用一个描绘人脸特征点的程序来讲解对SDK的调用。

    首先我们需要搭建一个简单的场景:一个开始测试的按钮,一张供测试和绘制特征点的图片,和显示debug信息的文字框:
    场景
    列表

    然后新建一个叫FaceDetector的脚本,定义变量:

    public Text debugInfo;                            // 显示debug信息
    public RawImage portrait;                         // 显示图片
    public Texture2D texture;                         // 用以描绘特征点的图片
    
    private Face client;                              // 用来调用百度AI接口
    private byte[] image;                             // 检测的图像数据
    private Dictionary<string, object> options;       // 返回的数据
    private JObject result;                           // 接收返回的结果

    在Awake方法中初始化数据:

    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
                        };
    
        client = new Face("", "");                 // 此处填写自己申请的key
        var path = Application.dataPath + "/BaiduAI/1.jpg";
        image = File.ReadAllBytes(path);
        options = new Dictionary<string, object>()
        {
            {"face_fields", "beauty,age,expression,gender,landmark" }
        };
    }

    然后定义一个DetectAndDraw方法,调用百度AI接口并且根据返回的landmark描绘人脸特征点:

    public void DetectAndDraw()
    {
        result = client.FaceDetect(image, options);                   // 调用API接口
        debugInfo.text = result.ToString();                           // 显示debug信息
    
        // 复制原图信息
        var width = texture.width;
        var height = texture.height;
        var mask = new Texture2D(width, height);
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
                mask.SetPixel(i, j, texture.GetPixel(i, j));
        }
    
        // 根据返回的landmark描绘特征点
        var r = result["result"];
        foreach(var value in r)
        {
            var landmarks = value["landmark72"];
            foreach(var lm in landmarks)
            {
                var x = int.Parse(lm["x"].ToString());
                var y = height - int.Parse(lm["y"].ToString());
                // 绘制点为3个像素点单位的正方形
                // 这里其实应该保证绘制的像素点位置在我们检测图片的像素点范围内
                for(int i = x - 1; i <= x + 1; i++)
                {
                    for (int j = y - 1; j <= y + 1; j++)
                    {
                        mask.SetPixel(i, j, Color.red);
                    }
                }
            }
        }
        // 显示描绘特征点之后的图像
        mask.Apply();
        portrait.texture = mask;
    }

    给Button的OnClick事件添加DetectAndDraw方法,运行并点击Button,就能绘制出人脸特征点了。
    运行结果

    注意如果要替换检测的图片,需要点击RawImage的Set Native Size确保RawImage的大小与检测图片大小一致,当然也可以在代码中根据两张图的比例来计算确保特征点对应。这里只介绍最简单的方法。

    运行程序前请先打开FaceDetector.cs脚本,在Awake方法中的client = new Face(“”, “”)处(line 33)添加自己的key。

    工程版本Unity2017.1.0f3。
    项目地址:http://pan.baidu.com/s/1kVDtgLx
    提取密码:1j5j

    By:蒋志杰

    展开全文
  • unity接入百度人体识别 1.去百度下载SDK 2.去百度云注册账号,申请AppID,AppKey,AppSecret 3.进入unity编写脚本 百度人体分析SDK调用 using UnityEngine; using Baidu.Aip.BodyAnalysis; using Newtonsoft.Json....

    unity接入百度人体识别

    1.去百度下载SDK

    • 复制AipSdk.dll到工程
    • 复制Newtonsoft.Json.dll到工程
    • 自己按照unity版本,选择2.0,3.5,还是4.0的dll

    2.去百度云注册账号,申请AppID,AppKey,AppSecret

    • 自行申请

    3.进入unity编写脚本

    • 百度人体分析SDK调用
    using UnityEngine;
    using Baidu.Aip.BodyAnalysis;
    using Newtonsoft.Json.Linq;
    using System.IO;
    using System;
    
    public class BaiduFaceAI : SingletonMono<BaiduFaceAI>
    {
        // 设置APPID/AK/SK
        const string APP_ID = "你的appid";
        const string API_KEY = "你的appkey";
        const string SECRET_KEY = "你的appsecret";
    
        private Body client;
    
        void Start()
        {
            client = new Body(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超时时间
        }
    
        /// <summary>
        /// 检测图像byte流
        /// </summary>
        /// <param name="image">图像或者摄像的byte流</param>
        /// <param name="callback">回调是否是人体</param>
        public void BodyAnalysis(byte[] image,Action<bool> callback)
        {
            try
            {
                //加载本地图片
                //string path = Application.dataPath + "/test.jpg";
                //var image = File.ReadAllBytes(path);
    
                //接受图像的bytes
                var result = client.BodyAnalysis(image);
                callback(IsHuman(result));
            }
            catch (System.Exception e)
            {
                Debug.Log(e);
            }
        }
    
        /// <summary>
        /// //过滤方法:当关键点得分大于0.2的个数大于3,且人体框的分数大于0.03时,才认为是有效人体
        /// </summary>
        /// <param name="result">检测的JObject结果</param>
        /// <returns>是否是人体</returns>
        bool IsHuman(JObject result)
        {
            var persons = result["person_info"].Children();
            //多个人
            foreach (var person in persons)
            {
                //单个人的身体部位
                var parts = person["body_parts"].Children();
                var bodyScore = float.Parse(person["location"]["score"].ToString());
    
                if (bodyScore > 0.03f)
                {
                    int count = 0;
                    foreach (var part in parts)
                    {
                        var keys = part.Children();
                        foreach (var item in keys)
                        {
                            if (float.Parse(item["score"].ToString()) > 0.2f)
                            {
                                count++;
                            }
                        }
                        if (count > 3)
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }
    
    
    • 使用WebCamera用摄像头捕获人体识别
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class WebCamTool : SingletonMono<WebCamTool>
    {
    
        string DeviceName;
        WebCamTexture webCamera;
        Texture2D tex2d;
    
        public void StartWebCamera(RawImage raw)
        {
            StartCoroutine(CoWebCamera(raw));
        }
        public void StopWebCamera()
        {
            if (webCamera != null)
                webCamera.Stop();
        }
    
        /// <summary>    
        /// 初始化摄像头  
        /// </summary>    
        IEnumerator CoWebCamera(RawImage raw)
        {
            yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
            if (Application.HasUserAuthorization(UserAuthorization.WebCam))
            {
                WebCamDevice[] devices = WebCamTexture.devices;
                if(devices.Length>0)
                {
                    DeviceName = devices[0].name;
                    webCamera = new WebCamTexture(DeviceName, Screen.width, Screen.height, 60);
                    raw.texture = webCamera;
                    webCamera.Play();
                }
            }
        }
    
        Texture2D TextureToTexture2D(Texture texture)
        {
            Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);
            RenderTexture currentRT = RenderTexture.active;
            RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);
            Graphics.Blit(texture, renderTexture);
    
            RenderTexture.active = renderTexture;
            texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
            texture2D.Apply();
    
            RenderTexture.active = currentRT;
            RenderTexture.ReleaseTemporary(renderTexture);
    
            return texture2D;
        }
    
        public byte[] GetBytes(RawImage image)
        {
            Texture2D tex2d = TextureToTexture2D(image.texture);
            return tex2d.EncodeToJPG();
        }
    }
    
    
    • 使用方法
        /// <summary>
        /// 开启WebCamare,拍摄画面在RawIamge显示
        /// </summary>
        void StartWebCamera()
        {
            rawImage.gameObject.SetActive(true);
            WebCamTool.Instance.StartWebCamera(rawImage);
    
            //StartCoroutine(CheckFace());
        }
    
        //开启协程监听是否扫描到人体,2s一次
        IEnumerator CheckFace()
        {
            while (true)
            {
                yield return new WaitForSeconds(2);
                if (rawImage.isActiveAndEnabled && rawImage.texture != null)
                {
                    var bytes = WebCamTool.Instance.GetBytes(rawImage);
                    BaiduFaceAI.Instance.BodyAnalysis(bytes, (isHuman) => {
                        if(isHuman)
                        {
                            Debug.Log("检测到人体");
                        }
                    });
                }
            }
        }
    
    • 希望这篇文章能够对你有所帮助
    展开全文
  • 接着上一章unity3d人脸识别(一)来讲 本教程仅供参考学习使用 转载请注明出处 上一章讲到如何实现两张照片中的人脸对比,基于此功能, 本章将讲到如何通过摄像头捕捉到的人脸图像实现实时人脸识别对比,真正的...
  • 一、目录 【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷
  • 虽然以前没接触过体感游戏,看到的体验也是大部分看到的视频,幸好现在网络还是比较发达,上网大概了体感游戏开发,目前比较好的是Unity3D和Kinect结合交互进行开发。现在心里的感觉用句话说:哥现在也走在世界技术...
  • Kinect结合Unity3D引擎开发体感游戏(一) http://my.oschina.net/klttl/blog/161694  最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,...
  • 本文将把常用的Unity插件分成11大类进行归档,方便各位Unity开发者查找使用。 整理成了一个电子书方便大家查阅,下载地址:Asset Store寻宝书百度网盘,提取码:dfun 一:用Unity开发手机游戏的常用插件 越来越多...
  • 概要:续接上文,本文进一步讲解与分析了上文未讲完的Unity5中Standard Shader正向基础渲染通道源码的片段着色实现部分,以及对屏幕像素化后期特效进行了实现。 同样需要声明的是。本文中对Stardard Shader源码的...
  • 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解。虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心的谁都能用的3D引擎...
  • 这篇文章介绍如何使用EasyAR.unitypackage配置EasyAR 参考资料 1、EasyAR 初学者入门指南 http://forum.easyar.cn/portal.php?mod=view&amp;amp;amp;amp;amp;aid=2 2、EasyAR入门 ...
  • 2、然后点开右上角的控制台,找到图像识别,创建应用,然后就可以看到创建的密钥,我们主要获取以下几个参数, API_KEY, SECRET_KEY 3、将对应C#版本的SDK下载后,添加引用到工程文件引用中; 主要是以下两个.dll库...
  • Unity 开发AR之 Vuforia 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!...
  • 识别图片中的手部位置和手势类型,可识别24种常见手势,包括拳头、OK、比心、作揖、作别、祈祷、我爱你、点赞、Diss、Rock、竖中指、数字等 2.平台接入 具体接入方式比较简单,可以参考我的另一个帖子,这里就不...
  • 一 人脸识别引擎 (一).集成WebAPI 目前以百度云,腾讯云为首的互联网公司提供了基于WEBAPI的集成方式,可以通过HTTP的方式提交识别请求,识别结果通过JSON串的方式返回。基于HTTP的方式识别人脸是比较慢的,慢的...
  • 经过上一篇的学习,我相信开发环境您已经搭好了,如果还没有搭好可以百度一下。 今天主要讲的有以下几点: 第一:Unity3D中的C#脚本与.net中的C#写法的...3.Unity3D C#脚本 get/set写法属性不被识别,直接publi...
  • 1、 图片识别与建模 2、 虚拟按键小游戏 一.什么是AR AR是Augmented Reality的缩写,中文翻译为现实增强(扩增实境)。AR是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术。也就是说,AR就是将虚拟信息...
1 2 3 4 5 ... 20
收藏数 453
精华内容 181