Face++初体验以及如何在Unity中选择本地文件(PC)

来源:互联网 发布:九章算法 培训视频 编辑:程序博客网 时间:2024/06/07 10:54

突然发现前面的笔记图片都没了,才意识到将图片复制粘贴进输入框不行嘛尴尬

年初的时候因为好奇做了好几个demo,试了试讯飞的语音识别,Face++的图像识别,Bmob的支付接口。

说实话,现在已经不记得当初发生了什么。

这种功能性的东西,用起来觉得很强大很实用,但有时候又觉得花时间去学意义也不大,无他,实在是觉得自己代码能力就太差,应该把精力用在提升内力上。而且这些东西,有些开发基础的人都能学会使用,所以除了项目有需求之外,我觉得以后还是适当的控制下好奇心比较好,不然古怪的东西总是看不完。


今天主要记一下Face++和Unity中选取本地文件


先上一张界面的截图,这样子发布图片应该是没问题的了。

最初我是想要Face++帮我判断两张图片上的是不是同一个人,就是Face++的人脸对比功能。

国际惯例,注册,登录,找到自己的app key和app serect,然后看看官方文档

https://console.faceplusplus.com.cn/documents/4887586


face++的免费服务都是在线的,通过创建表单,构建POST请求的方式得到返回结果。应该是有离线SDK的,但是好像要钱,这个我真没有···


IEnumerator UploadIE() {        WWWForm wf = new WWWForm();        wf.AddField("api_key", "这里填appkey");        wf.AddField("api_secret", "这里填appserect");        WWW Img1 = new WWW("file:///"  + text1.text);        yield return Img1;        byte[] bytes1 = Img1.bytes;        //rawI1.texture = Img1.texture;        WWW Img2=new WWW("file:///"  + text2.text);        yield return Img2;        //rawI2.texture = Img2.texture;        byte[] bytes2 = Img2.bytes;        //byte[] bytes2 = t2.EncodeToJPG();        wf.AddBinaryData("image_file1", bytes1,"image/jpg");        wf.AddBinaryData("image_file2", bytes2,"image/jpg");        //byte bytes1 = tex1;        WWW www = new WWW(faceUrl,wf);        yield return www;        UnityEngine.Debug.Log(www.text);        JSONObject content = JSONObject.Parse(www.text);        JSONObject thresholds = content.GetObject("thresholds");        //小于这个值 通常认为不是同一个人        double min = thresholds.GetNumber("1e-3");        //大于这个值 通常认为是同一个人        double max = thresholds.GetNumber("1e-5");        double confidence = content.GetNumber("confidence");        UnityEngine.Debug.Log(min + " " + max + " " + confidence);        if (confidence < min)        {            MessageBox.Show("不是同一个人");        }        else if (confidence > min&&confidence<max)        {            MessageBox.Show("有可能是同一个人");        }        else if (confidence > max) {            MessageBox.Show("是同一个人");        }    }

调用URL

https://api-cn.faceplusplus.com/facepp/v3/compare

上面的代码做的事情是创建了一个表单,表单包括了key,serect和两张图片。具体的文档中关于请求参数有说明。

请求的结果是一个json。我用Boomlagoon解析了一下,主要是获取thresholds节点下的三个数据:

1e-3: 误识率为千分之一的置信度阈值;

 1e-4: 误识率为万分之一的置信度阈值;

 1e-5: 误识率为十万分之一的置信度阈值;

如果置信值低于“千分之一”阈值则不建议认为是同一个人,如果置信值超过“十万分之一”阈值,则是同一个人的几率非常高。

以及置信度confidence。

然后对比一下,就判断出是不是同一个人。


我当时找了徐峥对比汪涵,夏雨对比张一山,周杰伦对比大木老师···只是测试,并没有什么意思。


原先我的图片是通过在输入框填写本地地址,然后程序读取,然后通过表单上传。

然后这个demo我就搁置了下来,直到前两天,我突然想到,那么多程序都是选取本地图片或者文件夹的,哪有手动填地址的。我不知道怎么能选取到本地的文件,于是我决定学习一下。


我最先搜的可能是如何打开文件管理器

Process p = new Process();        p.StartInfo.FileName = "explorer.exe";        //p.StartInfo.Arguments = @" I:\2017\Learn\Face++\Assets\StreamingAssets";        string path = Application.streamingAssetsPath;        path = path.Replace('/', '\\');        p.StartInfo.Arguments =@" /select,"+Path.Combine(path,"Images\\wh.jpg");

它做的是帮你打开一个文件夹,确实可以选中某个文件,但真的是选中,就像你平时找文件一样,你再双击一下,他就会按它默认的打开方式打开,根本不是我想要的。explorer.exe是访问文件的,换成iexplore.exe,它还能访问网址。


然后我找到了一个看起来靠谱点的

首先下载或者在unity安装目录下找到System.Windows.Forms.dll;然后再asset下新建Plugins目录,拖进去。

然后在代码中using一下,开始调用

OpenFileDialog ofd = new OpenFileDialog();        ofd.InitialDirectory = "file://" + UnityEngine.Application.dataPath;        //ofd.RestoreDirectory = true;        ofd.Title = "选择图片";        if (ofd.ShowDialog() == DialogResult.OK) {            UnityEngine.Debug.Log(ofd.FileName);        }
这个真的是弹出一个框,选取文件,上文debug出了选中文件的完整路径。

功能上是满足了,但是,


界面长这样,怎么算。这明显是上个时代的既视感。关键是看别人博客里也不截图说界面,好像有个截了图的是正常的界面。我复制粘贴了他的代码,但是界面还是这样,我重新找了找dll,替换了下发现并没有什么改变···


于是我又继续找,终于找到了更靠谱的



这次需要新建两个文件。

直到这时候,找到了大神的一篇博客,发现该说的都说了

直接贴链接

http://www.cnblogs.com/U-tansuo/archive/2012/07/10/GetOpenFileName.html


3 0
原创粉丝点击