开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1907

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1443|回复: 33

[仅为年时] unity进行文字图像识别——Face++(续)

[复制链接]  [移动端链接]
排名
680
昨日变化
2

250

主题

1302

帖子

6105

积分

Rank: 16

UID
73452
好友
88
蛮牛币
3435
威望
0
注册时间
2015-2-6
在线时间
1813 小时
最后登录
2017-10-20

专栏作家蛮牛译员社区QQ达人活力之星七夕浪漫情人原创精华达人论坛发帖强人蛮牛哥认证开发者

QQ
发表于 2017-9-30 09:14:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
回顾上篇:
unity进行文字图像识别——Face++


之前测试了一篇face++API的文字识别,有评论者问怎么不识别网络图片而是识别本地图片,于是补充一下:

如图:

face1.gif



该部分是通过截图存储本地图片,然后识别该图片。

face2.png


关键代码部分:
[C#] 纯文本查看 复制代码
//创建纹理(纹理贴图的大小和截屏的大小相同)
        Texture2D tex = new Texture2D((int)rect.width, (int)rect.height,TextureFormat.RGB24, false);
        //读取像素点
        tex.ReadPixels(rect, 0, 0);
        //将像素点应用到纹理上,绘制图片
        tex.Apply();
        //将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
        byte[] result = tex.EncodeToPNG();
        //文件夹(如果StreamAssets文件夹不存在,在Assets文件下创建该文件夹)
        if (!Directory.Exists(Application.streamingAssetsPath))
            Directory.CreateDirectory(Application.streamingAssetsPath);
        //将截屏图片存储到本地
        string filename = Application.dataPath + "/StreamingAssets/Screenshot.png";
        File.WriteAllBytes(filename, result);

        //Debug.Log("文字");
        //识别文字
        WWWForm form = new WWWForm();
        form.AddField("api_key", "4diXTcIKqzKR1kE7HqJxQhdSKoDaQlQS");
        form.AddField("api_secret", "CBrU3vHl8sPdkEUc2efZaBBhhdZRBaX4");
        form.AddBinaryData("image_file", tex.EncodeToPNG());




完整代码:
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using LitJson;
using UnityEngine.UI;

public class FaceTest1 : MonoBehaviour
{
    public InputField inputImageURL;
    public string ImageURL = "";
    //按钮上的文本
    public Text Btn_ShibieText;
    //显示结果
    public GameObject ShowResult;
    //相机/用于截图使用
    public Camera Cam;

    Rect rect;
    //截屏开始的位置
    Vector3 s_pos;
    //截屏结束的位置
    Vector3 e_pos;
    //是否绘制
    bool isDraw;
    //绘制状态
    bool stateDraw = false;
    //开始绘制
    bool stateDrawStart = false;

    // Use this for initialization
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (stateDraw == true)
        {
            //按下鼠标左键时,记录当前鼠标的位置为开始截屏时的位置
            if (Input.GetMouseButtonDown(0))
            {
                stateDrawStart = true;
                s_pos = Input.mousePosition;
            }
            //鼠标处于按下状态时
            if (Input.GetMouseButton(0))
            {
                e_pos = Input.mousePosition;
                //可以开始绘制
                isDraw = true;
            }
            //抬起鼠标左键时,记录当前鼠标的位置为结束截屏时的位置
            if (Input.GetMouseButtonUp(0) && stateDrawStart == true)
            {
                //结束绘制
                isDraw = false;
                e_pos = Input.mousePosition;
                //获取到截屏框起始点的位置,和宽高。
                rect = new Rect(Mathf.Min(s_pos.x, e_pos.x), Mathf.Min(s_pos.y, e_pos.y), Mathf.Abs(s_pos.x - e_pos.x), Mathf.Abs(s_pos.y - e_pos.y));
                //开启绘制的协程方法
                StartCoroutine(Capsture(rect));
                stateDraw = false;
                stateDrawStart = false;
            }
        }
    }

    public void TestHttpSend()
    {
        if(inputImageURL.text != "")
        {
            ImageURL = inputImageURL.text;
        }
        //识别文字
        WWWForm form = new WWWForm();
        form.AddField("api_key", "4diXTcIKqzKR1kE7HqJxQhdSKoDaQlQS");
        form.AddField("api_secret", "CBrU3vHl8sPdkEUc2efZaBBhhdZRBaX4");
        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 != "")//if (postData.error != null)
        {
            //Debug.Log(postData.error);
            Btn_ShibieText.text = "识别";
            //ShowResult.transform.Find("Text").GetComponent<Text>().text = "识别失败!";
            GameObject.Find("DebugText").GetComponent<Text>().text = postData.error;
        }
        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);
        string ResultStr = "";
        //Debug.Log(jd["result"].Count);
        for (int i = 0; i < jd["result"].Count; i++)
        {
            for (int j = 0; j < jd["result"]["child-objects"].Count; j++)
            {
                //Debug.Log(jd["result"]["child-objects"][j]["type"].ToString());
                Debug.Log(jd["result"]["child-objects"][j]["value"].ToString());
                ResultStr = ResultStr + jd["result"]["child-objects"][j]["value"].ToString();
            }
        }
        ShowResult.transform.Find("Text").GetComponent<Text>().text = ResultStr;
    }
    /// <summary>
    /// 拍照按钮
    /// </summary>
    public void Btn_JieTu()
    {
        Btn_ShibieText.text = "请框选截图";
        stateDraw = true;
        //CaptureCamera(Cam, new Rect(0, 0, Screen.width * 0.5f, Screen.height * 0.5f));
    }
    ////截图并且识别
    //void CaptureCamera(Camera camera, Rect rect)
    //{
    //    // 创建一个RenderTexture对象  
    //    RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
    //    // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
    //    camera.targetTexture = rt;
    //    camera.Render();

    //    RenderTexture.active = rt;
    //    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
    //    screenShot.ReadPixels(rect, 0, 0);
    //    screenShot.Apply();

    //    // 重置相关参数,以使用camera继续在屏幕上显示  
    //    camera.targetTexture = null;
    //    RenderTexture.active = null;
    //    GameObject.Destroy(rt);
    //    //                // 最后将这些纹理数据,成一个png图片文件  
    //    byte[] bytes = screenShot.EncodeToPNG();
    //    string filename = Application.dataPath + "/StreamingAssets/Screenshot.png";
    //    System.IO.File.WriteAllBytes(filename, bytes);
    //    Debug.Log(string.Format("截屏了一张照片: {0}", filename));

    //    Debug.Log("文字");
    //    //识别文字
    //    WWWForm form = new WWWForm();
    //    form.AddField("api_key", "4diXTcIKqzKR1kE7HqJxQhdSKoDaQlQS");
    //    form.AddField("api_secret", "CBrU3vHl8sPdkEUc2efZaBBhhdZRBaX4");
    //    form.AddBinaryData("image_file", screenShot.EncodeToPNG());
    //    StartCoroutine(SendPost("https://api-cn.faceplusplus.com/imagepp/beta/recognizetext", form));
    //}

    IEnumerator Capsture(Rect rect)
    {
        yield return new WaitForEndOfFrame();

        //创建纹理(纹理贴图的大小和截屏的大小相同)
        Texture2D tex = new Texture2D((int)rect.width, (int)rect.height,TextureFormat.RGB24, false);
        //读取像素点
        tex.ReadPixels(rect, 0, 0);
        //将像素点应用到纹理上,绘制图片
        tex.Apply();
        //将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
        byte[] result = tex.EncodeToPNG();
        //文件夹(如果StreamAssets文件夹不存在,在Assets文件下创建该文件夹)
        if (!Directory.Exists(Application.streamingAssetsPath))
            Directory.CreateDirectory(Application.streamingAssetsPath);
        //将截屏图片存储到本地
        string filename = Application.dataPath + "/StreamingAssets/Screenshot.png";
        File.WriteAllBytes(filename, result);

        //Debug.Log("文字");
        //识别文字
        WWWForm form = new WWWForm();
        form.AddField("api_key", "4diXTcIKqzKR1kE7HqJxQhdSKoDaQlQS");
        form.AddField("api_secret", "CBrU3vHl8sPdkEUc2efZaBBhhdZRBaX4");
        form.AddBinaryData("image_file", tex.EncodeToPNG());
        StartCoroutine(SendPost("https://api-cn.faceplusplus.com/imagepp/v1/recognizetext", form));
    }
    //在这里要用GL实现绘制截屏的矩形框
    //1.GL的回调函数
    //2.定义一个材质Material
    public Material lineMaterial;

    void OnPostRender()
    {
        if (!isDraw) return;
        //print(s_pos);

        Vector3 sPos = Camera.main.ScreenToWorldPoint(s_pos + new Vector3(0, 0, 10));
        Vector3 ePos = Camera.main.ScreenToWorldPoint(e_pos + new Vector3(0, 0, 10));

        //print(string.Format("GL.....{0},  {1}", sPos, ePos));
        // Set your materials Done
        GL.PushMatrix();
        // yourMaterial.SetPass( );
        lineMaterial.SetPass(0);//告诉GL使用该材质绘制
                                // Draw your stuff
                                //始终在最前面绘制
        GL.invertCulling = true;
        GL.Begin(GL.LINES);//开始绘制

        //GL.Vertex(sPos);
        //GL.Vertex(ePos);
        //如果想要绘制,矩形,将下面代码启动
        GL.Vertex(sPos);
        GL.Vertex(new Vector3(ePos.x, sPos.y, 0));


        GL.Vertex(new Vector3(ePos.x, sPos.y, 0));
        GL.Vertex(ePos);

        GL.Vertex(ePos);
        GL.Vertex(new Vector3(sPos.x, ePos.y, 0));

        GL.Vertex(new Vector3(sPos.x, ePos.y, 0));
        GL.Vertex(sPos);
        GL.End();//结束绘制

        GL.PopMatrix();
    }
}




这只是文字识别的部分,其它的还有人脸识别,人体识别啥的,大家就自行研究使用吧。




回复

使用道具 举报

6蛮牛粉丝
1392/1500
排名
1549
昨日变化
2

1

主题

422

帖子

1392

积分

Rank: 6Rank: 6Rank: 6

UID
56496
好友
0
蛮牛币
4016
威望
0
注册时间
2014-11-19
在线时间
311 小时
最后登录
2017-10-20
发表于 2017-9-30 09:35:46 | 显示全部楼层
哈哈哈,哈哈哈哈哈哈哈

回复 支持 反对

使用道具 举报

3偶尔光临
269/300
排名
13180
昨日变化
265

2

主题

146

帖子

269

积分

Rank: 3Rank: 3Rank: 3

UID
208862
好友
0
蛮牛币
76
威望
0
注册时间
2017-2-27
在线时间
79 小时
最后登录
2017-10-20
发表于 2017-9-30 09:58:48 | 显示全部楼层
666666666666666到没朋友

回复 支持 反对

使用道具 举报

排名
17339
昨日变化
16

0

主题

29

帖子

87

积分

Rank: 2Rank: 2

UID
209237
好友
0
蛮牛币
118
威望
0
注册时间
2017-3-1
在线时间
34 小时
最后登录
2017-10-17
发表于 2017-9-30 10:17:49 | 显示全部楼层
感谢大佬分享。666

回复 支持 反对

使用道具 举报

5熟悉之中
841/1000
排名
2772
昨日变化
9

9

主题

118

帖子

841

积分

Rank: 5Rank: 5

UID
191997
好友
0
蛮牛币
3483
威望
0
注册时间
2017-2-22
在线时间
304 小时
最后登录
2017-10-20
发表于 2017-9-30 10:21:10 | 显示全部楼层
厉害了哈

回复

使用道具 举报

5熟悉之中
783/1000
排名
5396
昨日变化
2

0

主题

428

帖子

783

积分

Rank: 5Rank: 5

UID
209046
好友
0
蛮牛币
1267
威望
0
注册时间
2017-3-30
在线时间
159 小时
最后登录
2017-9-30

迈向小康

发表于 2017-9-30 10:42:34 | 显示全部楼层
感谢大佬

回复

使用道具 举报

3偶尔光临
220/300
排名
11160
昨日变化
12

0

主题

56

帖子

220

积分

Rank: 3Rank: 3Rank: 3

UID
163581
好友
0
蛮牛币
19
威望
0
注册时间
2016-8-22
在线时间
102 小时
最后登录
2017-10-19
发表于 2017-9-30 11:14:36 | 显示全部楼层
我回复代码会报错,然后也没识别到文字的?
InvalidOperationException: Instance of JsonData is not a dictionary
这个是识别结果:
{"image_id": "VLCIvZv84j/rgfpgEH/5mQ==", "result": [{"child-objects": [{"child-objects": [], "position": [{"y": 46, "x": 61}, {"y": 49, "x": 102}, {"y": 90, "x": 100}, {"y": 89, "x": 60}], "type": "character", "value": "\u4f60"}, {"child-objects": [], "position": [{"y": 46, "x": 101}, {"y": 46, "x": 145}, {"y": 89, "x": 145}, {"y": 90, "x": 101}], "type": "character", "value": "\u597d"}], "position": [], "type": "textline", "value": "\u4f60\u597d"}], "request_id": "1506741261,9a644a09-caab-42d2-8172-fab966e14f1c", "time_used": 306}

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1092/1500
排名
3597
昨日变化
15

0

主题

481

帖子

1092

积分

Rank: 6Rank: 6Rank: 6

UID
148286
好友
0
蛮牛币
2319
威望
0
注册时间
2016-5-11
在线时间
295 小时
最后登录
2017-10-20

迈向小康

发表于 2017-9-30 11:55:42 | 显示全部楼层

回复

使用道具 举报

排名
680
昨日变化
2

250

主题

1302

帖子

6105

积分

Rank: 16

UID
73452
好友
88
蛮牛币
3435
威望
0
注册时间
2015-2-6
在线时间
1813 小时
最后登录
2017-10-20

专栏作家蛮牛译员社区QQ达人活力之星七夕浪漫情人原创精华达人论坛发帖强人蛮牛哥认证开发者

QQ
 楼主| 发表于 2017-9-30 13:21:10 | 显示全部楼层
pk2xxx 发表于 2017-9-30 11:14
我回复代码会报错,然后也没识别到文字的?
InvalidOperationException: Instance of JsonData is not a di ...

请看具体api实例

回复 支持 反对

使用道具 举报

4四处流浪
363/500
排名
6215
昨日变化
52

0

主题

95

帖子

363

积分

Rank: 4

UID
229275
好友
0
蛮牛币
253
威望
0
注册时间
2017-6-28
在线时间
108 小时
最后登录
2017-10-20
发表于 2017-9-30 13:43:49 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1928/5000
排名
6375
昨日变化
67

4

主题

1579

帖子

1928

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
2
蛮牛币
2531
威望
0
注册时间
2017-3-1
在线时间
189 小时
最后登录
2017-10-20
发表于 2017-9-30 15:18:38 | 显示全部楼层
谢谢大佬分享

回复

使用道具 举报

4四处流浪
340/500
排名
8302
昨日变化
93

1

主题

106

帖子

340

积分

Rank: 4

UID
224031
好友
0
蛮牛币
718
威望
0
注册时间
2017-5-27
在线时间
125 小时
最后登录
2017-10-21
发表于 2017-9-30 16:14:40 | 显示全部楼层
学习下,谢谢分享

回复

使用道具 举报

排名
13180
昨日变化
9

0

主题

31

帖子

93

积分

Rank: 2Rank: 2

UID
229748
好友
0
蛮牛币
113
威望
0
注册时间
2017-7-1
在线时间
18 小时
最后登录
2017-10-16
发表于 2017-9-30 17:07:24 | 显示全部楼层
感谢分享 6666666666666

回复 支持 反对

使用道具 举报

3偶尔光临
220/300
排名
11160
昨日变化
12

0

主题

56

帖子

220

积分

Rank: 3Rank: 3Rank: 3

UID
163581
好友
0
蛮牛币
19
威望
0
注册时间
2016-8-22
在线时间
102 小时
最后登录
2017-10-19
发表于 2017-9-30 17:16:15 | 显示全部楼层

我这边改动一些已经文字识别OK了,现在文字和字母数字在一起,数字识别不到。(类似车牌了),大大有什么好思路吗

回复 支持 反对

使用道具 举报

3偶尔光临
176/300
排名
11160
昨日变化
12

1

主题

56

帖子

176

积分

Rank: 3Rank: 3Rank: 3

UID
241851
好友
0
蛮牛币
408
威望
0
注册时间
2017-9-6
在线时间
55 小时
最后登录
2017-10-21
发表于 2017-9-30 22:56:53 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表