最近在公司里,我突然被老板指派了一个新任务:利用鸿蒙的文本识别API开发一个功能。虽然我有一定的鸿蒙开发经验,但面对这项任务时,还是有点紧张,因为这是我第一次接触到这个特定的API。老板只给了我一个链接,那就是官方的文本识别API文档。在简单浏览了一下文档后,我决定立刻动手,看看能不能把这个看起来有些复杂的功能搞定。

image.png

第一步:理解需求

老板的需求很明确:希望能够开发一个应用,能够从图片中提取文本,比如扫描快递单上的内容,自动提取地址和电话之类的信息。鸿蒙系统的文档给了我很多提示,但如何将它真正应用到项目中,这却是个挑战。我决定先用最简单的方式做个小demo,确保自己理解了文档中的每一个细节。

image.png

在深入阅读文档的过程中,我逐渐意识到,文本识别不仅仅是简单的文本提取,还需要处理各种各样的图像质量问题,比如光线不足、模糊等情况。为了确保我能够全面理解每一个步骤,我开始为每一个功能模块写一些小测试代码,通过这些实验,我逐渐掌握了文本识别API的工作原理。这也帮助我在后续开发中能够快速定位和解决问题。

第二步:开始动手

首先,我根据文档中介绍的内容配置了开发环境。这包括一些基本的配置步骤,比如在build.gradle文件中添加必要的依赖。

dependencies {
    implementation 'com.huawei.hms:ml-computer-vision:5.0.0.300'
}

接下来,我开始实现文本识别的基本功能。根据文档的提示,我需要先导入必要的包并初始化文本识别器:

import com.huawei.hms.mlsdk.text.MLTextAnalyzer;
import com.huawei.hms.mlsdk.text.MLText;

public class TextRecognitionDemo {
    private MLTextAnalyzer analyzer;

    public void initializeAnalyzer() {
        analyzer = new MLTextAnalyzer.Creator().create();
    }
}

通过这一小段代码,我创建了一个文本分析器。接下来要做的就是将它应用到图片中,看看能不能识别出图片中的文字。

在这个过程中,我也遇到了一些坑,比如初始化分析器的时候需要确保设备连接到互联网,否则API无法正常工作。这个问题在我最初的测试中浪费了不少时间,但最终通过仔细阅读文档和查看错误日志,我找到了问题的根源并成功解决。

第三步:图片处理与识别

我写了一个方法来从用户选择的图片中获取文本信息,这也是实现文本识别的核心部分。这里是主要的代码段:

public void analyzeTextFromImage(Bitmap bitmap) {
    MLFrame frame = MLFrame.fromBitmap(bitmap);
    Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
    
    task.addOnSuccessListener(mlText -> {
        // 处理成功的结果
        StringBuilder recognizedText = new StringBuilder();
        for (MLText.Block block : mlText.getBlocks()) {
            recognizedText.append(block.getStringValue()).append("\n");
        }
        System.out.println("识别的文本内容: " + recognizedText.toString());
    }).addOnFailureListener(e -> {
        // 处理失败的情况
        System.err.println("文本识别失败: " + e.getMessage());
    });
}

这段代码会接收用户上传的图片,并将其转换为MLFrame,然后通过analyzer.asyncAnalyseFrame(frame)进行文本识别。成功的话,识别到的文本会被输出到控制台。

在开发这部分功能时,我尝试了不同类型的图片,包括手写文本、印刷体文本以及一些背景复杂的图片。通过不断测试和调整,我逐渐找到了API在不同情况下的表现,并根据测试结果对代码进行了优化。例如,我发现手写文本的识别效果相对较差,因此需要结合一些图像预处理技术来提高准确性。

第四步:调试与优化

在实际测试的时候,我发现有些图片因为光线太暗或者背景太复杂,识别效果并不是特别好。于是我参考了文档中关于优化图片质量的建议,尝试做了一些预处理,比如调整对比度和亮度,甚至引入了简单的滤镜来去除噪点。

为了实现这些改进,我引入了一些图像处理库,比如OpenCV,用来对图片进行预处理。例如,我添加了一个增强对比度的功能,使得文字在图像中的边缘更加清晰,从而提高识别率。同时,我还编写了一个简单的降噪算法,用于去除图片中的背景干扰。这些改进虽然增加了一些开发时间,但效果非常明显,识别的准确性有了显著提升,特别是在办公室的环境光下,识别率提升了大约20%。

在整个调试过程中,我也遇到了一些挑战,比如在低光环境下图像的噪声非常严重,导致识别结果不理想。为了克服这些问题,我专门研究了一些图像增强的技术,并结合鸿蒙API的能力,对图像进行了一系列优化处理。最终,这些努力得到了回报,系统的整体识别效果有了很大改善。

第五步:整合与展示

当功能基本实现后,我将其集成到了公司原有的系统中。为了让它更符合用户的操作习惯,我还添加了一些UI界面,用户可以直接通过手机拍照,然后自动识别出文本内容并显示在屏幕上。

为了提升用户体验,我设计了一些额外的功能。例如,当用户拍摄图片时,我加入了一个实时预览的功能,用于在拍照前对图像质量进行评估,提示用户是否需要调整光线或重新拍摄。这不仅提高了识别的成功率,也让用户感觉更加智能和人性化。

当我在周会上向老板和同事们展示这个功能时,他们都觉得非常有用,尤其是物流部门的同事,因为这个功能可以大幅减少手动输入的工作量,提高效率。物流部门的同事表示,之前他们需要手动录入快递单信息,既费时又容易出错。而现在,只需要用手机拍个照,系统就能自动识别并录入,大大减轻了他们的工作负担。

最后的感悟

从接到任务到最后成功开发出这个文本识别功能,整个过程虽然有些曲折,但我觉得非常充实。官方文档虽然内容很多,但一步步解读、实验,再到解决具体问题的过程,让我对鸿蒙的API有了更深的理解。最重要的是,我也在这个过程中感受到了开发的乐趣与成就感。

在这个项目中,我不仅学到了如何使用鸿蒙的文本识别API,还学会了如何通过不断的测试和优化来提升系统的性能和用户体验。这种不断探索和改进的过程让我更加深刻地理解了开发工作的本质——不仅仅是实现功能,而是要追求更高的质量和更好的用户体验。

image.png

如果你也在做类似的开发任务,不妨多看看官方文档,多动手试一试,遇到问题也不用怕,慢慢来总能解决!我相信,只要保持好奇心和耐心,每一个开发者都能在这样的过程中获得成长和满足感。


郝敬学
22 声望1 粉丝