我在HarmonyOS 7上用三行代码做了个扫描工具,才明白端侧AI为什么是小开发者的春天

说实话,一开始看到API 26更新Core Vision Kit的时候,我没太当回事。
OCR嘛,哪个平台没有?百度阿里腾讯都有免费接口,接一下也不难。图像超分更是老话题了,各种APP都带,吹了好几年。文搜图听起来玄乎,不就是 embedding 向量检索么,自己也能搭。
直到上周我妈给我发了张社区医院开的处方单,拍得歪歪扭扭,光线又暗,她戴着老花镜念半天念不对药名,我突然想起来刚更的API 26有端侧OCR,干脆花一晚上写个小工具试试。
结果写完我愣了——从新建工程到跑通第一个识别结果,我真的只写了十几行代码,模型不用下,权限不用申请一堆,图片选进来100毫秒出结果,而且全程没联网。我妈那张歪了快30度、光线昏暗的处方单,除了医生手写的鬼画符认不出来,打印的药名、剂量、医嘱居然一个字都没认错。
那天我坐在电脑前坐了半天,突然反应过来:以前我们说"AI能力平民化"都是喊口号,这一次是真的轮到小开发者了。
先说说最实用的:通用文字识别,真的是打开就能用
我先做的就是OCR,因为需求最刚。
以前我也接过第三方的OCR SDK,那叫一个麻烦:先去开发者平台注册账号,申请appkey,下载几百MB的SDK包,配混淆规则,处理so库兼容,还要考虑用户没联网的时候用不了,敏感图片不敢传。而且免费额度用完了就要给钱,个人开发者根本扛不住。
这次接Core Vision Kit的OCR,流程简单到我不敢相信:
第一步,在module.json5里加一行权限声明:ohos.permission.READ_IMAGEVIDEO,就这一个,因为读相册需要,识别本身不需要任何特殊权限。
第二步,导包:
import { textRecognition } from '@kit.CoreVisionKit';
第三步,选一张图片,转成PixelMap,传进去:
// 就这么多
const visionInfo = { pixelMap: selectedPixelMap };
const result = await textRecognition.recognizeText(visionInfo);
console.log('识别结果:', result.value);
没了。真的没了。
扫描界面运行效果——手机对准文档时自动检测出的蓝色边框:

OCR文字识别效果——文字块坐标框标注与识别结果

我当时写完按运行,以为至少要等它下载模型,结果一点就出结果了,速度快到我以为是假的。后来才知道,模型是系统内置的,跟系统一起升级,用户手机里本来就有,开发者不用打包,不用下,不用管版本更新,系统自己维护。
这是什么概念?你的安装包不会因为加了OCR功能多一兆体积。以前接第三方OCR,光模型文件就要二三十兆,打进去包直接肥一圈,现在完全没这个问题。
我测了十几种场景,说说真实表现怎么样
我专门找了各种奇奇怪怪的图来测,不是官方那种摆拍的样张,就是手机里真实拍的东西:
能打满分的场景:
- 打印的文档、PPT、书本文字:几乎100%准确率,排版都不乱,连段落换行都给你保留了
- 路牌、店铺招牌、菜单:不管白天晚上,只要字够大,基本全对
- 快递单、小票、处方单:只要是打印的,歪个二三十度完全没事,它自己会矫正
- 电脑屏幕截图:连小字都能认出来,复制代码比敲方便多了
- 中日韩英混排:我找了张日本便利店的小票,中文英文日文混在一起,识别得明明白白
会翻车的场景:
- 手写体:别想了,尤其是医生那种草书,基本认不出来,官方文档也明说了只支持印刷体,这点不骗人
- 角度太歪:超过正负30度正确率直线下降,所以我在APP里加了个手动旋转的控件,歪太狠了让用户转一下
- 反光严重:比如玻璃上的字,或者屏幕拍出来有摩尔纹,会认错几个字
- 字特别小:分辨率低于720p的图确实不行,放大了糊,它也认不出来
- 艺术字、花体字:认不出来很正常,人眼有时候都费劲
透视矫正前后对比——左侧是倾斜有阴影的原始照片,右侧是矫正后的平整扫描件:

黑白文档增强效果对比——左为发灰有阴影的原图,右为增强后的纯黑白扫描件

这里有个细节我特别喜欢:返回结果不止是一整段文字,每个字、每一行都带坐标和置信度。
interface TextRecognitionResult {
value: string; // 整段文字
lines: Array<{
content: string;
boundingBox: Rect; // 这一行在外框里的位置
words: Array<{
content: string;
boundingBox: Rect;
confidence: number; // 这个字的置信度0-1
}>
}>
}
我用这个做了个功能:识别完之后,用户点图片上哪个位置,就自动选中对应的文字复制。这个效果以前要自己做图像处理,现在坐标系统都给你返回好了,直接用就行。
还有个小坑我踩了半天:一开始我直接把相册里拿到的原图uri传进去,经常报错。后来才知道,它要求的是PixelMap,而且图片高度要在100到15210像素之间,宽度100到10000像素。太大的图(比如4800万像素拍的原图)要先压缩一下,不然内存直接爆。我后来统一压到最长边2000像素,识别速度快了三倍,准确率几乎没影响。
对了,还有人关心速度问题:我测了一下,一张1080p的图,识别时间在80-150毫秒之间,基本就是点一下立刻出结果,完全感觉不到等待。云端OCR快的时候也要一秒多,慢的时候转圈圈,这个体验差距真的很大。
最重要的是:整个过程图片从来没有离开过用户的手机。
你识别身份证、银行卡、处方单、合同这些敏感东西的时候,不用担心哪个公司的服务器存了你的信息,不用担心泄露。作为开发者,我也不用担心里程碑合规问题,不用写隐私弹窗说"我们会把你的图片传到服务器识别",这一点太省心了。
再说说被我低估的:4倍端侧超分,不是噱头是真有用
做完OCR,我顺手把图像超分也接了,本来以为是个凑数的功能,结果成了我自己用得最多的。
超分这个东西,大家都见过,很多手机相册自带"高清修复",说白了就是把模糊的图片放大变清晰。以前这类功能要么是云端算(传上去等半天),要么是本地算法效果很假,边缘涂得像油画。
API 26这个超分,同样是几行代码:
import { imageProcessing } from '@kit.CoreVisionKit';
const result = await imageProcessing.superResolution({
pixelMap: lowResPixelMap,
scale: 4 // 目前支持4倍
});
// result.pixelMap 就是超分后的图
我一开始测的是表情包:群里存的那种糊得看不清脸的老表情包,4倍放大之后居然真的清晰了,边缘锐化得很自然,没有那种过度锐化的锯齿感。
真正让我觉得牛的是我翻出来一张2018年拍的板书,当时坐后排用旧手机拍的,糊得字都看不清,我本来想丢了,试了一下超分——一秒钟之后,PPT上的字居然能看清了。
这个处理速度真的惊到我:一张1080p的图,超分到4K,端侧处理只用了不到一秒钟。我查了一下,它是用NPU跑的,不是CPU,所以不仅快,还特别省电,手机几乎不发热。
我在工具里加了个小功能:识别文字的时候,如果检测到图片分辨率太低,自动弹个提示"图片较模糊,是否先高清放大再识别?",点一下一秒钟超分完再识别,正确率能提升一大截。这个组合拳打下来,体验真的丝滑。
当然也有坑:超分最大只支持输入短边720像素的图,也就是说你本来就是清晰的大图,它不让你超,只有模糊的小图才能用。一开始我没看文档,直接传原图进去报错,查了半天才知道有这个限制。想想也合理,本来就是用来拯救低清图的,高清图再超分也没意义。
还有就是不要拿它去超文字特别小的图,它会把噪点也一起放大,效果反而不好。正确用法是:拍糊了的照片、老照片、低清表情包、缩略图,这些场景下它真的像魔法一样。
最惊喜的:文搜图,全本地闭环这事儿居然成了
三个能力里我本来最不看好文搜图,结果玩了一下午,发现这个才是真正的杀手功能。
什么叫文搜图?就是你不用给图片打标签,直接在相册搜索框里输入"猫",就能找出所有带猫的照片;输入"海滩",所有海边的照片都出来;输入"去年在武汉吃的热干面",它真的能给你找出来。
以前这个功能只有大厂相册能做,而且基本都是把图片传到云端,服务器算完给你返回结果。且不说隐私问题,个人开发者根本做不了——你总不能让用户把所有照片都传到你的服务器吧?流量费你都出不起。
现在API 26直接把这个能力下放到端侧了,全程本地算,数据不出设备。
接入同样简单得离谱:
import { imageSearch } from '@kit.CoreVisionKit';
// 第一步:建索引,把要搜的图片加进去
await imageSearch.addImage({
uri: photoUri,
label: photoName // 可选,自带的标签
});
// 第二步:搜索,传自然语言
const results = await imageSearch.search({
queryText: '樱花',
maxResult: 20
});
// results 就是匹配的图片uri列表
就这么简单。没有向量数据库要搭,没有模型要部署,系统全给你封装好了。
我自己建了个测试库,导进去三千多张照片,试了各种关键词:
- 搜"猫":把我家猫各种姿势的照片全找出来了,连猫只露半个脑袋的都找到了
- 搜"雪":所有下雪天拍的照片全中
- 搜"火锅":不管是铜锅、四川火锅、自助火锅,全搜出来了
- 搜"毕业照":居然真的把我几年前穿学士服的照片找出来了
- 搜"发票":各种打车票、餐饮票、高铁票全出来了——这个太实用了,报销的时候找票太方便了
当然也不是万能的,搜特别具体的东西就不行,比如我搜"我家的橘猫",它会把所有橘色的猫都找出来,分不清是不是我家的;搜具体人名也认不出来,毕竟没有做人脸训练。但日常搜个场景、搜个东西、搜个文档类型,完全够用。
这里有个很重要的设计细节:建索引是增量的,而且系统会在手机闲置充电的时候自动帮你建,你不用自己在后台跑任务卡UI。我第一次导进去三千张图,系统花了大概十分钟在后台建完索引,之后每次新加图片自动增量索引,用户完全感知不到。
最爽的是什么?作为开发者,你根本不用懂什么是CLIP模型,什么是向量相似度,什么是embedding维度——你甚至不需要知道这些概念存在,你只需要调用两个方法:addImage和search,剩下的全是系统的事。
我一个学美术的朋友,HDC大赛的时候用这个接口,花了不到一百行代码做了个"找照片"的原子化服务,就拿这个功能,进了决赛。他连算法是什么都不知道,就知道传文字进去返回图片。放在三年前,你能想象一个非计算机专业的学生,花一天时间做出来一个本地自然语言图片搜索功能吗?
说几个我踩过的、文档没写太明白的坑
接这三个能力前后花了我三天,大部分时间都在踩各种小坑,这里都写出来,省得大家再浪费时间:
第一,别在主线程做重处理。 虽然这几个接口都是异步的,但图片解码、PixelMap转换这些操作还是挺吃资源的,大图片直接在UI线程转,会卡一下。我一开始没注意,选张大图的时候按钮点下去没反应,后来统一放到TaskPool里转PixelMap,就顺了。
第二,用完记得释放PixelMap。 超分一张图生成的4K PixelMap占内存很大,大概有几十兆,用完如果不release,多来几次直接OOM崩溃。我一开始忘了释放,切了十来张图APP就闪退了,找了半天才找到原因。
第三,OCR对图片方向是有要求的。 如果图片是横着拍的(比如拍路牌手机横着拿),识别之前一定要把EXIF方向信息读出来,把PixelMap旋转到正向,不然歪90度它一个字都认不出来。官方文档说支持正负30度倾斜,那是指正向基础上的倾斜,不是说你倒过来拍也能认。
第四,并发调用会排队。 我一开始想批量识别一百张图片,写了个循环一口气调用一百次recognizeText,结果后面的全部报错。后来才知道系统端侧AI能力是有并发限制的,同一时间只能跑一个任务,批量处理要自己做队列,一张一张来。
第五,超分只支持低清图。 前面说过了,输入短边必须小于等于720像素,传大图直接报错,别问我怎么知道的。
第六,文搜图的索引是跟你的应用绑定的。 你卸载APP索引就没了,也不能跨应用共享。如果是原子化服务,缓存空间有限,别往里面塞几十万张图,系统会自动清理最久没用到的索引。
最后说点心里话:这才是生态真正的变化
做完这个小工具之后,我最大的感受不是"这几个API多好用",而是:开发者的门槛真的被打下来了。
以前想做一个带OCR、带图片高清化、带图片搜索的APP,需要什么配置?至少一个客户端开发,一个算法工程师,还要租服务器,买带宽,付云端接口调用费,没有十万块钱启动资金想都别想。小团队、个人开发者、学生,根本玩不起。
现在呢?一个人,一台电脑,一根网线,一下午时间,三行代码一个功能,就能做出来。不用买模型,不用租服务器,不用考虑隐私合规,不用管模型更新——系统全帮你做了。
HDC大赛我去现场看了,20支决赛队伍,有工艺美院学设计的学生,有师范大学大一的新生,有独立开发者,甚至还有高中生。他们36小时写出来的东西,搁两年前是一个小团队做半年的水平。不是说他们突然变厉害了,是系统把难的事情全做了,他们只需要专注想创意、写逻辑、做界面。
以前大家总说鸿蒙是"换皮安卓",但你仔细想想:安卓上哪个系统级API能让你三行代码做4倍超分?哪个系统能给你内置端侧OCR还不用带模型?哪个系统能让你不用搭向量数据库就做本地文搜图?
这些东西不是做不出来,是以前只有大厂有能力做,现在华为把它做到系统里,免费开放给所有开发者,你不需要懂AI,不需要懂算法,直接拿来用就行。
我不是替华为吹什么,就是作为一个普通的独立开发者,真真切切感受到:以前很多你想都不敢想的功能,现在真的是几行代码的事。当造应用的门槛低到这个程度的时候,真正好的创意才会冒出来——毕竟好想法从来都不缺,缺的是把想法变成产品的能力。
我把我写的那个小扫描工具上架了,叫"随手识字",包不到2MB,没有广告,不要登录,所有功能全本地。上架第一个星期有两千多下载,评论里有大学生用来拍板书,有上班族用来扫合同,有老人用来识别药盒说明书,还有人用来扫漫画上的日文翻译。
最让我开心的是我妈现在每天都用,拍个药方、拍个快递单、拍个社区通知,识别完字放大了看,再也不用戴老花镜一个字一个字猜了。
你看,技术真正的价值从来不是什么高大上的名词,就是这些解决真实小问题的瞬间。而端侧AI最大的意义,就是让我们这些普通开发者,也能轻松做出这样的功能,帮到身边具体的人。
就冲这一点,HarmonyOS 7这个版本,值得认真做。
更多推荐


所有评论(0)