2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 微信开发——人脸识别 车牌识别 语言识别

微信开发——人脸识别 车牌识别 语言识别

时间:2021-11-10 22:27:37

相关推荐

微信开发——人脸识别  车牌识别  语言识别

基于微信的人脸识别(简单地画出人脸大概区域)和车牌识别,后台用Java Web

人脸识别:openCV,Harris特征,直接用openCV自带的训练好的xml文件,发送图片到测试公众号,后台接收图片,检测人脸,画出区域,返回给用户

车牌识别:easyPR,识别出车牌后返回给用户

最开始做之前感觉很简单,比较基本上都是用第三方工具,而之前微信也看过点视频,后面却遇到各种问题,蛋疼不已。

最开始用MyEclipse6.5(版本比较老) + Servlet搭建后台,因为用的openCV3,而opencv3需要JDK8,MyEclipse6.5又不支持JDK8

那就换Eclipse Kepler吧,人脸识别基本上OK了(有时候计算时间太长也会没有响应,而且有时候会接收图片好几次,应该是Servlet并发的问题,多次响应,最后也没怎么管这个,反正大多数情况下可以返回),但是弄easyPR检测车牌就遇到问题,

easyPR是自己把Eclipse工程导入的,其中有个根目录下的res文件,里面存放了一些训练好的model,但是部署到Tomcat的时候老是不能把这个文件部署上去,重新换回MyEclipse单独测试这个车牌检测的代码也是不行,想到若干种办法:(1)手动复制res文件,(2)把easyPR打包成Jar加到之前的人人脸识别工程中,(3)更改res文件为resource file,(4)打包成war包,手动部署到Tomcat

最后都是不行,加GitHub上的那个QQ群问,也没个人回,最后就想:只能是一点点看代码,看能不能找到load训练好的模型是怎么用res路径的,

但是又想到了SpringBoot,它内置了Tomcat服务器,免去了部署,说不定就不会有这个问题,最后终于OK了,Springboot大法好啊。。。。GitHub大法好啊,之前还准备自己写车牌识别,分割提取之类的,没想到GitHub上就有类似的轮子,Issue里面还可以讨论问题,真的不错

记录一下问题:

1. Java 8 Compiler要1.7以上

2. eclipse默认不是部署到Tomcat的webapps,Myeclipse是,但部署都不会吧工程的所有文件部署进去,

部署到wenapps下就不需要启动eclipse来运行app了,直接开启tomcat就ok,没有部署可以显得登录tomcat在部署一下

3. 部署的时候会把resource folder展开,自己把资源文件复制到webapps会有问题

4. 直接打包Jar也会出现资源文件路径的问题

5. eclipse部署JAr可能也没有部署进去,通过Properties的Deploy选项可以设置,或者自己手动复制Jar到webapps相应目录下

6. OpenCV3 的Jar包先build到maven仓库,然后在POM文件中引用就OK

虽然比较简单,还是贴一下核心代码,有时间把一些结果图片也弄一下,以后可以多在GitHub上面逛

@RestController@EnableAutoConfiguration//@SpringBootApplicationpublic class Example {public boolean flag = true;public boolean isFaceDete = true;@AutowiredHttpServletRequest request;@AutowiredHttpServletResponse response;@RequestMapping("/weixin_test/wx.do")void home() throws Exception {System.out.println("hello");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");// 通过PrintWriter返回数据PrintWriter out = response.getWriter(); // 通过集合接收消息try {Map<String,String> map = MessageUtil.xmlToMap(request);String fromUserName = map.get("FromUserName");String ToUserName = map.get("ToUserName");String MsgType = map.get("MsgType");String Content = map.get("Content");String message = null;if(MessageUtil.MESSAGE_TEXT.equals(MsgType)){if("1".equals(Content)) {message = MessageUtil.initText(ToUserName, fromUserName, MessageUtil.secondMenu());} else if("2".equals(Content)) {message = MessageUtil.initNewsMessage(ToUserName, fromUserName);} else if("3".equals(Content)) {// change modeif(isFaceDete){message = MessageUtil.initText(ToUserName, fromUserName, "change to pr");isFaceDete=false;}else {message = MessageUtil.initText(ToUserName, fromUserName, "change to face detection");isFaceDete = true;}} out.print(message);System.out.println(message);} else if(MessageUtil.MESSAGE_IMAGE.equals(MsgType)) {//if(!flag)return;flag = false;String PicUrl = map.get("PicUrl");System.out.println(PicUrl);PicDownloadUtil.download(PicUrl);AccessToken token = WeixinUtil.getAccessToken();System.out.println("凭据:" + token.getToken());System.out.println("有效时间:" + token.getExpiresIn());if(isFaceDete) {FaceDetection.detect();String mediaId = WeixinUtil.upload("E:/data/weixin/FaceDetect.jpg", token.getToken(), "image");message = MessageUtil.initImageMessage(ToUserName, fromUserName, mediaId, PicUrl);out.print(message);// 好像一直在输出,是不是并发的问题??还是计算的时间太长了?System.out.println("****************************");System.out.println(message);out.print(message);} else {String imgPath = "E:/data/weixin/down.jpg";// File f = new File(imgPath);// System.out.println(f.exists());// System.out.println("**************");// String result = "detecting nothing";//Mat src = imread(imgPath);PlateDetect plateDetect = new PlateDetect();plateDetect.setPDLifemode(true);Vector<Mat> matVector = new Vector<Mat>();if (0 == plateDetect.plateDetect(src, matVector)) {CharsRecognise cr = new CharsRecognise();for (int i = 0; i < matVector.size(); ++i) {String tmp = cr.charsRecognise(matVector.get(i));if(tmp.length() > 2)result = tmp;System.out.println("Chars Recognised: " + result);}}System.out.println("detect finished .... ");message = MessageUtil.initText(ToUserName, fromUserName, result);out.print(message);//Main.run();}}} catch (Exception e) {e.printStackTrace();} finally {out.close();flag = true;}}public static void main(String[] args) throws Exception{SpringApplication.run(Example.class, args);}}

Feature added:语言识别功能,通过语音切换模式

刚开始想用讯飞开放平台,但是好像他们对语音文件的格式要求比较严格,16K采样,pcm格式等等,反正自己录音只能是借助于特定录音软件,本来也想用ffepg对录音进行格式转换,但是不清楚ffepg的命令,转换出来也识别不了,后来发现微信直接内置了语言识别的功能,只需要从接收消息中取出来就好了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。