????????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ?????
??
???
???? 作者 : 不良使
????? 潜力创作新星 华为云享专家
?????? 博客记录学习的思路,项目和错误,寻找志同道合的朋友
??????? 如果觉得有帮助记得一键三连 ┗|`O′|┛ 嗷~~
????????
???????? ???????? ???????? ???????? ???????? ??????? ???????? ???????? ???????? ???????? ???????
??一、实验目的
本次实验通过使用讯飞开放平台上文字识别的能力,介绍了文字识别中的 印刷体文字识别 WebAPI 的使用,结合服务机器人的相机能力,开发一个简单 的印刷体文字识别应用程序,了解文字识别技术如何在机器人上使用, 同时对文字识别技术的使用步骤进行详细讲解,理解起来更加轻松。调用讯飞接口和外设套件通过套件摄像头实现文字捕捉和识别。
??二、实验内容
随着人工智能的热度上升,图像识别这一分领域也渐渐被人们所关注。图像 识别中最贴近我们生活的可能就是 OCR 技术,OCR 指电子设备(例如扫描仪 或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用 字符识别方法将形状翻译成计算机文字的过程。 从整体上来说,OCR 一般分为两个大步骤:图像处理以及文字识别。图像处 理是在识别文字前,我们要对原始图片进行预处理,以便后续的特征提取和学习。 这个过程通常包含:灰度化、二值化、降噪、倾斜矫正、文字切分等子步骤。每 一个步骤都涉及了不同的算法。处理完毕后,就到了文字识别的阶段。主要有以下几个阶段
??1、了解讯飞开放平台账号申请、应用创建及配置;
??2、了解讯飞开放平台文字识别相关 API;
??3、掌握印刷体文字识别 WebAPI 的使用
??三、实验步骤
??步骤 1:开放平台账号申请及能力注册
由于本次实验开发的人脸识别功能应用使用的是科大讯飞开放平台提供的 人脸识别能力,我们需要先到讯飞的开放平台申请账号,并完成平台上相关能力 注册,具体流程如下: 1)首先,我们要在讯飞开放平台进行账号注册,地址:https://www.xfyun.cn/
完成注册后,登陆开放平台,进入控制台。点击“创建应用”,完成应用相关信息的输入后,点击“提交”按钮
此时,进入“我的应用”界面,可以看到添加的应用信息,包括 appid 等,点 击“其他”,在弹出的界面中选择“人脸验证与检索”的管理服务,可以选择对 应的服务完成 SDK 的下载
在其他中找到文字识别,下载对应的SDK。注意,文字识别需要的印刷体。
??步骤 2:项目工程搭建及能力包导入
??步骤 3:功能代码开发
(部分代码:)
套件初始化
机器人能力一般会作用于项目的整个生命周期,因此我们的初始化可以在 MainActivity.的 onCreate 中进行,也可以在应用的 Application。通过oncreate初始化机器人(套件)的能力。
@Overridepublic void onCreate() { super.onCreate(); mContext = getApplicationContext(); init();}private void init() { StarLogAbility.getInstance().initAbility(this); //基础能力初始化 StarCommonAbility.getInstance().initAbility(this, RobotType.TYPE_TEACHING, new StarCommonAbility.onResultCallback() { @Override public void onResult(boolean isSuccess, String hardCode) { if (isSuccess) { //硬件和业务状态初始化 switch (hardCode) { case PartCode.HARDWARE_PARTCODE.CODE_EMOJI: //设置初始表情 EmojiHelper.doEmojiBase(); break; case PartCode.HARDWARE_PARTCODE.CODE_GPIO: //默认加载的时候,将拾音方向设置为默认正前方的0度。 GPIOHelper.getInstance().setMainMic(0); break; case PartCode.HARDWARE_PARTCODE.CODE_CENTER_LIGHT: //关闭腹部灯带 CenterLightHelper.takeCenterLightOff(); break; default: break; } } } }); //图像识别能力初始化,离线OCR识别实验demo中暂不使用 //因第一次初始化时间可能较慢,可以先进行实例化操作 //PictureOCRHelper.getInstanse(); //图像识别能力初始化,OcrHelper为封装的webapi的接口帮助类 OcrHelper.getInstance().init(APPID,API_KEY);}
??Camera 初始化
我们创建 MainActivity,在 onCreate 后初始化相机, openCamera 传入 FrameLayout(可选)为预览视图,setOnCameraPrepareListener 为准备完成回调, setGetBitmapListener 设置获取图像的回调。
public class MainActivity extends AppCompatActivity implements CameraHelper.GetBitmapListener { private static final String TAG = MainActivity.class.getSimpleName(); private CameraHelper cameraHelper; private ImageView picView; private ImageView takePicBtn, cropPicBtn, ocrPicBtn, backPicBtn; private FrameLayout frameLayout; private Bitmap mBitmap, mCropBitmap; private HandlerThread handlerThread; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handlerThread = new HandlerThread("ocrThead"); handlerThread.start(); mHandler = new Handler(handlerThread.getLooper()); layoutView(); initCamera(); } @Override public void getBitmap(Bitmap bitmap) { mBitmap = bitmap; mBitmap = bitmap; picView.setImageBitmap(bitmap); picView.setVisibility(View.VISIBLE); showCrop(); }
??控件初始化
protected void layoutView() { //照片显示 picView = (ImageView) findViewById(R.id.iv_pic); takePicBtn = (ImageView) findViewById(R.id.takepic); cropPicBtn = (ImageView) findViewById(R.id.croppic); ocrPicBtn = (ImageView) findViewById(R.id.ocrpic); backPicBtn = (ImageView) findViewById(R.id.backpic); cropPicBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { cropBirmap(); } }); //OCR识别 ocrPicBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHandler.post(new Runnable() { @Override public void run() { String result = OcrHelper.getInstance().ocrForFont(WEBOCR_GENERAL_URL,mCropBitmap); showToast(result); Log.d(TAG,"result = " + result); } }); } }); //返回 backPicBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showTakePic(); } }); //拍照按钮 takePicBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //调用拍照 cameraHelper.takePreView(); } });}
??步骤 4:应用权限申请
跟以前在安装 APP 的是就申请了权限不同,Google 在 API 23,也就 Android6.0 之后加入了动态权限。对于一些敏感的权限,决定权交还给了用户, 不再是强制申请了。因为这个原因,如果 APP 需要支持 Android6.0 以上的系 文档密级:外部公开 20 统,就需要进行一下适配,否则 APP 就会崩溃。 除了进入设置手动开启权限,还有两种方式让应用获得权限:动态权限申请、 平台签名。本次实验我们采用平台签名的方式获得权限。
??步骤5:实验结果
?? 参考资料与扩展阅读
1)Android 开发工具网站
2)Android 开发者社区
3)科大讯飞 AIUI 开放平台
4)科大讯飞开放平台文档中心
最后,兄弟们悠着点,免费(白嫖)用户,一天就500次交互机会,手下留点情。
觉得有用的可以给个三连,关注一波!!!带你了解更多的智能机器人小知识