前言
年關掃福的號角一吹響,日常社交用語里就多了一句:你有敬業福嘛?今年是集五福的第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{
……
// 引入基礎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<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技術和華為機器學習能力,能輕易實作“掃福”,強大的功能帶來的識別范圍不止于“福”字,“萬物皆可掃”也成為可能,如何更好地利用功能為運營加分,為增長蓄能,“掃福”已經做了一個不錯的示范,更好的范例和成果等你去大膽實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258466.html
標籤:其他
上一篇:spring cloud ouath2中的資源服務器
下一篇:微信小程式云開發動態制作小程式碼
