草庐IT

讯飞AIUI智能机器人7-----文字识别

不良使 2023-04-13 原文

🍖🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖
🍖🍖
🍖🍖🍖
🍖🍖🍖🍖 作者 : 不良使
🍖🍖🍖🍖🍖 潜力创作新星 华为云享专家
🍖🍖🍖🍖🍖🍖 博客记录学习的思路,项目和错误,寻找志同道合的朋友
🍖🍖🍖🍖🍖🍖🍖 如果觉得有帮助记得一键三连 ┗|`O′|┛ 嗷~~
🍖🍖🍖🍖🍖🍖🍖🍖

🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖🍖 🍖🍖🍖🍖🍖🍖🍖

🍓🍓一、实验目的

本次实验通过使用讯飞开放平台上文字识别的能力,介绍了文字识别中的 印刷体文字识别 WebAPI 的使用,结合服务机器人的相机能力,开发一个简单 的印刷体文字识别应用程序,了解文字识别技术如何在机器人上使用, 同时对文字识别技术的使用步骤进行详细讲解,理解起来更加轻松。调用讯飞接口和外设套件通过套件摄像头实现文字捕捉和识别。


🍓🍓二、实验内容

随着人工智能的热度上升,图像识别这一分领域也渐渐被人们所关注。图像 识别中最贴近我们生活的可能就是 OCR 技术,OCR 指电子设备(例如扫描仪 或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用 字符识别方法将形状翻译成计算机文字的过程。 从整体上来说,OCR 一般分为两个大步骤:图像处理以及文字识别。图像处 理是在识别文字前,我们要对原始图片进行预处理,以便后续的特征提取和学习。 这个过程通常包含:灰度化、二值化、降噪、倾斜矫正、文字切分等子步骤。每 一个步骤都涉及了不同的算法。处理完毕后,就到了文字识别的阶段。主要有以下几个阶段
💖💖1、了解讯飞开放平台账号申请、应用创建及配置;
💖💖2、了解讯飞开放平台文字识别相关 API;
💖💖3、掌握印刷体文字识别 WebAPI 的使用

🍓🍓三、实验步骤

💥💥步骤 1:开放平台账号申请及能力注册

由于本次实验开发的人脸识别功能应用使用的是科大讯飞开放平台提供的 人脸识别能力,我们需要先到讯飞的开放平台申请账号,并完成平台上相关能力 注册,具体流程如下: 1)首先,我们要在讯飞开放平台进行账号注册,地址:https://www.xfyun.cn/

插条广告,不过说真的,这款软件是真的不错。

介绍一下牛客。Leetcode有的刷题牛客都有,除此之外牛客里面还有招聘(社招和校招)、一些上岸大厂的大佬的面试经验。 牛客是可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到感兴趣的可以去注册试试可以伴随一生的刷题app

完成注册后,登陆开放平台,进入控制台。点击“创建应用”,完成应用相关信息的输入后,点击“提交”按钮

此时,进入“我的应用”界面,可以看到添加的应用信息,包括 appid 等,点 击“其他”,在弹出的界面中选择“人脸验证与检索”的管理服务,可以选择对 应的服务完成 SDK 的下载

在其他中找到文字识别,下载对应的SDK。注意,文字识别需要的印刷体。

💥💥步骤 2:项目工程搭建及能力包导入



💥💥步骤 3:功能代码开发

(部分代码:)

套件初始化
机器人能力一般会作用于项目的整个生命周期,因此我们的初始化可以在 MainActivity.的 onCreate 中进行,也可以在应用的 Application。通过oncreate初始化机器人(套件)的能力。

@Override
public 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次交互机会,手下留点情。







觉得有用的可以给个三连,关注一波!!!带你了解更多的智能机器人小知识

有关讯飞AIUI智能机器人7-----文字识别的更多相关文章

  1. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  5. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  6. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby - 字符串文字前面的 * 在 ruby​​ 中有什么作用? - 2

    这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw

  9. ruby - 使用 ruby​​ 识别阵列上的运行 - 2

    如果我们有一个数组array=[1,1,0,0,2,3,0,0,0,3,3,3]我们如何识别给定数字的运行(具有相同值的连续数字的数量)?例如:run_pattern_for(array,0)->2run_pattern_for(array,3)->1run_pattern_for(array,1)->1run_pattern_for(array,2)->0没有2的运行,因为没有连续出现2。3有一个运行,因为只有一个幻影以树为连续数字。 最佳答案 尝试:classArraydefcount_runs(element)chunk{|n

  10. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

随机推荐