热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“扫五福”的实现原理和技术详解

扫,五福,的,实现,

年关集福的号角一吹响,日常社交用语里就多了一句:你有敬业福嘛?今年是集五福的第6年,这场搭载手机的年味仪式,让古早的“福”文化又登上新时代的C位。不难发现,我们拿着手机,不管面对的是笔端纤细的手写福,还是电子屏幕上五花八门的花体福,“扫福”功能都能轻易识别。那么,是什么技术实现扫福,又让扫福得以如此简单易操作,本文试着对扫福进行一次技术详解,看完这篇,没准你的app也能来一次“万物皆可扫”的有趣活动。

“AR扫福”技术解读

1、OCR原理

“AR扫福”加持的第一个技术是光学字符识别技术(Optical Character Recognition, OCR),手机等电子设备扫描任意载体上较为清晰的字符,通过对字符明暗的检测确定其形状,再通过字符形状识别翻译输出对应的文字。

常见的OCR应用

如今OCR技术已经深入生活的诸多方面。例如,身份证、护照、车牌号等证件识别,纸质文档扫描识别,时下一些在线答题的学习软件也凭借OCR实现了拍照搜题功能。

OCR的技术路线 

预处理环节的五大“门神”
(1)灰度化
字符输入设备后,在预处理环节,首先经过“灰度化”处理,降低复杂背景环境的干扰,只保留敏感度信息的图片。灰度化满足的公式一般为:Gray=0.299R+0.587G+0.114B
 
(2)二值化
图片灰度化后进行“二值化”做进一步背景简化,环节将图片简化为非黑即白的前景信息和背景信息,前景信息是需要读取的信息为为黑色,背景信息为白色。
 
(3)降噪
要完成更精确的识别还需要对图片进行降噪处理。图像噪声是指存在于图像数据中的不必要的或多余的干扰信息,图像噪声的来源在图像获取和传递过程中收到传感器材质、工作环境以及传输介质等的各种影响,都会产生。二值化后的字符周围小黑点越多图片噪声越大,影响字符的精确切割。所以二值化后再进行图片降噪成为必要。
 
(4)倾斜矫正
降噪处理后,为了方便后续的字符切割,还要进行一道倾斜校正的工序,即将歪斜的图片以字符的公正排布进行图片矫正。霍夫变换时最常用的矫正方法,基于二值图片进行直线检测,基本原理在于利用点与线的对偶性,将断续的字符连城一条直线,在进行直线水平矫正。
 
(5)字符切割
经过重重筛选,最后筛出具有明确清晰字符的图片,就可进行行切分和字符切分。为下一步字符识别和翻译输出做准备。
 
字符识别和翻译
以上一顿操作,提取出真实需要的内容,处理清晰化的字符再与模板库进行匹配,输出匹配结果。

2、用ML机器学习实现“扫福”功能

华为机器学习服务(HUAWEI ML Kit)提供文本识别能力,利用OCR技术,将拍摄到的文字提取出来,转换为文本信息。除了简体中文,该能力还支持在手机端识别日文、韩文、英文、西班牙文、葡萄牙文、意大利文、德文、法文和俄文,下面我们就来看看如何简单地实现这一强大功能。

在开始开发前,需要先配置HMS Core的Maven仓地址,具体可以参考:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-maven-0000001050040031-V5
之后将文本识别的基础SDK包和语言包添加到依赖中。

dependencies{ …… // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-ocr:2.0.5.300' // 引入中英文文字识别模型包 implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:2.0.5.300' …… } 

为了实现实时根据拍摄到的画面进行文字识别,我们选用ML Kit的端侧视频流文本识别能力,首先创建并初始化一个LensEngine对象

private LensEngine lensEngine = null; private void createLensEngine() { if (this.lensEngine == null) { this.lensEngine = new LensEngine(this, this.cameraConfiguration, this.graphicOverlay); } try { this.lensEngine.setMachineLearningFrameTransactor(this.localTextTransactor); isInitialization = true; } catch (Exception e) { Toast.makeText( this, "Can not create image transactor: " + e.getMessage(), Toast.LENGTH_LONG) .show(); } } 

接下来创建文本识别的处理类“LocalTextTransactor”,继承BaseTransactor接口

public class LocalTextTransactor extends BaseTransactor

在其中的LocalTextTransactor方法中,创建一个MLTextAnalyzer文本分析器,并且将识别的语种设置为中文“zh”

MLLocalTextSetting optiOns= new MLLocalTextSetting.Factory() .setOCRMode(MLLocalTextSetting.OCR_TRACKING_MODE) .setLanguage(language) .create(); MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(options);

当获取到文本的识别结果之后,将识别到的字符打印显示到对应的位置

protected void onSuccess( Bitmap originalCameraImage, MLText results, FrameMetadata frameMetadata, GraphicOverlay graphicOverlay) { this.mlText =results; this.latestImageMetaData = frameMetadata; graphicOverlay.clear(); List blocks = results.getBlocks(); if ((Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) && originalCameraImage != null) { CameraImageGraphic imageGraphic = new CameraImageGraphic(graphicOverlay, originalCameraImage); graphicOverlay.addGraphic(imageGraphic); } if (blocks.size() > 0) { this.mCount = 0; this.mHandler.sendEmptyMessage(Constant.SHOW_TAKE_PHOTO_BUTTON); } else { this.mCount++; if (this.mCount > 1) { this.mHandler.sendEmptyMessage(Constant.HIDE_TAKE_PHOTO_BUTTON); } } for (int i = 0; i  lines = blocks.get(i).getContents(); for (int j = 0; j 

调用LensEnginerun方法,启动相机读取视频流,即可进行识别

SurfaceView mSurfaceView = findViewById(R.id.surface_view); try { lensEngine.run(mSurfaceView.getHolder()); } catch (IOException e) { // 异常处理逻辑。 } 

识别完成之后,停止分析器,释放对应的视频流资源

if (analyzer != null) { try { analyzer.stop(); } catch (IOException e) { // 异常处理。 } } if (lensEngine != null) { lensEngine.release();

完成以上步骤,简单的“扫五福”功能就实现了

总结与思考

凭借OCR技术和华为机器学习能力,能轻易实现扫福,强大的功能带来的识别范围不止于字,万物皆可扫也成为可能,如何更好地利用功能为运营加分,为增长蓄能,扫福已经做了一个不错的示范,更好的范例和成果等你去大胆实践。


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有