前言

年关扫福的号角一吹响,日常社交用语里就多了一句:你有敬业福嘛?今年是集五福的第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仓地址,具体可以参考:配置Maven仓地址

之后将文本识别的基础SDK包和语言包添加到依赖中。

dependencies{
……// 引入基础SDKimplementation '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<MLText>接口

public class LocalTextTransactor extends BaseTransactor<MLText>

在其中的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<MLText.Block> 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 < blocks.size(); i++) {List<MLText.TextLine> lines = blocks.get(i).getContents();for (int j = 0; j < lines.size(); j++) {// Display by line, without displaying empty lines.if (lines.get(j).getStringValue() != null && lines.get(j).getStringValue().trim().length() != 0) {BaseGraphic textGraphic = new LocalTextGraphic(graphicOverlay,lines.get(j));graphicOverlay.addGraphic(textGraphic);}}}graphicOverlay.postInvalidate();
}

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

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

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解华为移动服务最新技术资讯~

“扫五福”的实现原理和技术详解相关推荐

  1. 光纤收发器工作原理及技术详解

    一.光纤收发器介绍 光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器(Fiber Converter).产品一般应用在以太网电缆 ...

  2. 光纤收发器的原理及应用_光纤收发器工作原理 - 光纤收发器工作原理及技术详解(分类,使用方法及接线图)...

    四.光纤收发器工作原理 光纤收发器一般应用在以太网电缆无法覆盖.必须使用光纤来延长传输距离的实际网络环境中,同时在帮助把光纤最后一公里线路连接到城域网和更外层的网络上也发挥了巨大的作用.有了光纤收发器 ...

  3. 拐道交叉的css3动画,CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...

  4. 支付宝扫五福,你扫了吗

    序言 有的时候吹牛逼也能达到一种心流的状态... 年底了,一年一度的活度又开始了,朋友圈又开始了扫福的风暴...这...肯定是假的朋友... 风言风语 1 杀产品经理祭天 每次一个活动不好的时候,我们 ...

  5. python模拟春节集五福_过年扫五福,干脆我用Python做一个五福生成器

    原标题:过年扫五福,干脆我用Python做一个五福生成器 新的一年又要到来了,各个大的公司又在这年末为大家送上了新春的祝福,支付宝还是延续了这几年的传统,在年末为大家送上了集五福的活动,为了大家能更快 ...

  6. 视频直播技术详解(7)现代播放器原理

    <视频直播技术详解>系列之七:现代播放器原理 牛小七2016年9月29日发布在 视频直播技术详解 from: http://blog.qiniu.com/archives/7040 七牛云 ...

  7. 《视频直播技术详解》系列之七:现代播放器原理

    七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣. 结合七牛实时流网络 LiveNet 和直播云解 ...

  8. 负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解

    负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负载均衡的基 ...

  9. P2P技术详解(一):NAT详解——详细原理、P2P简介(转)

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...

最新文章

  1. 【转载】云计算的三种服务模式:IaaS,PaaS和SaaS
  2. ISME:沈农栾军波组揭示水平转移基因的功能
  3. python 删除文件-python 删除文件和读取文件
  4. kafka和mqtt的区别是什么?
  5. 72 页 PPT,带你梳理神经网络完整架构(含 PyTorch 代码)
  6. 不得不存!UI设计新手不可错过的7条实用法则
  7. 『线性空间 整数线性基和异或线性基』
  8. IDEA开发工具的学习
  9. leetcode 399. 除法求值(bfs)
  10. java 开发环境的搭建
  11. 一文了解CSP、NOIP、NOI 三大信息学赛事
  12. 计算机技能大赛 英语,计算机科学与技术学院英语技能大赛圆满结束
  13. c++语言绝对值函数,由C++绝对值函数想到的 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  14. springmvc的过滤器--Filter
  15. 中宣部防沉迷实名认证系统对接实例-JAVA版
  16. 惠普win10一键还原_执行 HP 系统恢复 (Windows 10)
  17. ORB-SLAM2系列第一章——简介
  18. 微信分享功能android,关于Android实现简单的微信朋友圈分享功能
  19. # Itext Pdf 生成、相关API
  20. 蓄电池内阻测试仪分析软件,蓄电池内阻测试仪

热门文章

  1. java 代码块_详解java中的四种代码块
  2. 最早应用计算机岩土三维模型技术,基于三维地质模型的岩土工程设计与可视分析...
  3. 新加坡移动端学习社交平台 Teamie 融资 110 万美元,ACP 基金领投
  4. MYSQL修改密码(附报错解决方案)
  5. JS面试题汇总(十)
  6. 编程要从娃娃抓起,我们程序员界也算后继有人了!
  7. 算法之路——深搜、广搜(简单搜索)
  8. java计算机毕业设计Vue.js音乐播放器设计与实现源码+mysql数据库+系统+lw文档+部署
  9. 20220314在MT6739的android8.1下打开gpio节点
  10. linux环境配置gvim