CameraX+MLKit打造超简单OCR方案

来源:IT之家 2023-01-19 10:01:19  阅读量:12647   

1.CameraX实现相机预览1.1 CameraX简介

CameraX+MLKit打造超简单OCR方案

Android从5.0开始推出了全新的相机框架Camera2与以前的相机相比,它更友好,功能更强大,使用起来也更昂贵在这种背景下,Google发布了CameraX,它基于Camera2封装,大大提高了API的可用性我们可以用很少的代码构建一个面向特定场景的相机应用,OCR就是一个典型的相机应用场景

CameraX引入了UseCase的概念来完成各种相机功能UseCase有利于解耦功能模块,专注于特定领域进行功能开发CameraX默认提供了几种常用的用例实现,可以满足大多数场景的需求

预览:提供相机取景和预览。

接下来,让我们用CameraX一步步完成相机预览功能

1.2 CameraX引入项目

首先,将CameraX相关库引入Gradle如下

实施 " Android x . camera:camera—life cycle:1 . 2 . 0 "实施 " Android x . camera:camera—view:1 . 2 . 0 "实施 " Android x . camera:camera—camera 2:1 . 2 . 0 "

另外需要使用相机,所以在AndroidManifest中申请相机权限。

lt,uses—permissionandroid:name = " Android . permission . camera " tools:ignore = " PermissionImpliesUnsupportedChromeOsHardware "/gt,1.3获取ProcessCameraProvider

CameraX通过ProcessCameraProvider访问摄像机实例顾名思义,ProcessCamera代表了每个应用程序进程中可以使用的相机服务,所以ProcessCameraProvider是一个进程单体,通过getInstance创建和获取

//异步返回创建的processcameraproviderfuture = processcameraproviderfuturegetinstance//Monitor process camera provider和get cameraproviderfutureadd listener...,contextcompat

在Runnable中成功获取了ProcessCameraProvider的单个实例,然后就可以用它来组装用例,实现相机功能了。

CameraX的一个重要特性是LifecycleAware摄像头可以根据应用的背景自动开启或关闭,减轻了开发者的精神负担添加用例时,ProcessCameraProvider将关联LifecycleOwner

UseCase根据生命周期调用onstate attached/onstate detached当我们定制用例时,我们可以在这里做一些预/后定制

1.4添加预览用例

//选择后置镜头Valcameraselector = cameraselector建筑商所需的朝向(相机选择器镜头_正面_背面)build//添加PreviveWusecasecameraproviderBintolilifecycle(生命周期所有者,cameraselector,预览)

如上,processcameraprovider # bintolifelicycle添加预览。

预览用例的创建非常简单,如下所示:

valpreview =预览。builder . build . lysetsurfaceprovider(preview view . surface provider)

创建预览的关键是设置要渲染的表面,这是通过PreviewView获得的。

PreViewView是CameraX提供的自定义视图,用于显示相机预览流,它可以根据需要在TexureView和SurfaceView之间切换。

1.5布局预览视图

我们可以在xml布局中使用PreviewView,如下所示。

lt,FrameLayoutandroid:id = "+id/container " gt,lt,Android x . camera . view . preview view Android:id = "+id/preview view "/gt,lt,/FrameLayoutgt。

如果用Compose来渲染UI,可以借助AndroidView来显示PreviewView。Compose显示相机预览的代码大致如下:

composablefuncamerasreen///Get ProcessCameraPro ProviderValcameraPro Provider future = remember pro ProcessCameraPro Providergetinstance(context)//显示预览Android视图(modifier = modifierfill maxsize,factory = CTX—gt,预览视图(CTX)LycameraproviderfutureAddListener(ValcameraproviderfuturegetValpreview =//省略valcameraSelector =//camera provider简介未绑定的cameraproviderbindtolifecycle(localifecycleowner当前,cameraselector,预览),contextcompatgetmainexecutor(预览视图context)) 2.mlkit实现字符识别2.1 MLKit

MLKit是Google面向移动开发者的机器学习库,帮助移动应用离线使用各种终端智能技术,比如:

自然语言处理:语言识别,智能回复,自动翻译等。

这些终端上的技术使应用更加智能,同时仍然保持高性能更重要的是,这一切都是免费的,不依赖于GMS

2.2将MLKit引入项目

本文主要使用MLKit的字符识别功能,只需要添加以下依赖项:

实现 ' com . Google . ml kit:text—recognition—Chinese:16 . 0 . 0—6 '

文本识别——中文可以识别汉字,还有其他一些构件可以识别非拉丁语言,比如日语和韩语。

2.3 CameraX实现图像分析

之前我们通过Preview实现了相机预览,之后我们在CameraProvider中加入了ImageAnalysis,可以接收相机的预览帧进行图像分析处理。

valimageAnalysis=ImageAnalysis建设者)setbackpressure strategy(image analysis策略_保持_唯一_最新)构建()ly//设置图像分析仪setAnalyzerexecutorsnewsinglethreadexecutor(),ocralyzeresult:string—//基于MLKit处理OCR,并返回ResultParameterAproviderbintolifecyclecallifecycleowner当前,相机选择器,预览,图像分析//提高图像分析能力并与生命周期相关联

SetBackpressureStrategy是一种缓冲策略,用于设置预览帧的产生和消耗它的默认值是图像分析Strategy _ Keep _ Only _ Latest,意味着新渲染的帧会在每一帧的分析完成之前自动丢弃,以避免排队

ImageAnalysis#setAnalyzer添加自定义图像分析器这里我们定义一个OcrAnalyzer,基于MLKit实现OCR功能

2.4自定义OcrAnalyzer

class ocr analyzer—gt,单位):ImageAnalysisanalyzer//Get text recognition privatevalcognition = text recognitiongetclient(中文文本识别构建器()build())//Overridfunanalyze(Image proxy:Image proxy)valimage = Image proxyimageif(图像!= null)valimageRotation = image proxy . imageinfo . rotationdegreesvalinputimage = input image . from media image(image,image rotation)recognition . process(input image)addonsuccesslistenerecognized text—gt,val text blocks = confirmatedtext.textblocks//Parse text blocks获取所需信息并返回extractText(textBlocks)leton recognized(it)image proxy . close()

ImageAnalysis返回的ImageProxy。分析器包含预览帧信息:

ImageProxy.image:图像信息

InputImage.fromMediaImage根据这两个参数获取具体的InputImage,后者提交识别这里的识别是可以识别中文的TextRecognition

2.5解析文本块

TextRecognition后会返回块/行/元素等数据结构,有利于进一步的细粒度解析。

Block代表一个自然段落,由几行组成,每行包含几个元素。

假设我们想从身份证上获取姓名和身份证号虽然我们不确定像身份证这样的排版会被识别成什么样的块,但是姓名和身份证号肯定是在不同的行

privatefunextractText:string vallines = text blocks . flatmapit . lines varname = " unknown " varid = " unknown " lines . foreachvallinetext = it . elements . jointostringit . textif(line text . contains( " name "))name = line text . substring after( " name ")if(line text . contains( "国民身份证号")) ID = linetext。( "身份证号 ")后的子字符串返回"$namen$id "

成功的文本识别的效果如下:

结束语

通过这样一个字符识别的小应用场景,我们真切感受到了CameraX和MLKit的开箱即用作为谷歌的官方工具包,它们还与Compose等其他Jetpack组件具有良好的兼容性得益于谷歌强大的开发者生态系统,开发者可以低成本开发自己的移动应用

声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多企业信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。投资有风险,需谨慎。

猜你喜欢

300

热门文章