
说实话一开始看到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}fromkit.CoreVisionKit;第三步选一张图片转成PixelMap传进去// 就这么多constvisionInfo{pixelMap:selectedPixelMap};constresultawaittextRecognition.recognizeText(visionInfo);console.log(识别结果:,result.value);没了。真的没了。扫描界面运行效果——手机对准文档时自动检测出的蓝色边框:OCR文字识别效果——文字块坐标框标注与识别结果我当时写完按运行以为至少要等它下载模型结果一点就出结果了速度快到我以为是假的。后来才知道模型是系统内置的跟系统一起升级用户手机里本来就有开发者不用打包不用下不用管版本更新系统自己维护。这是什么概念你的安装包不会因为加了OCR功能多一兆体积。以前接第三方OCR光模型文件就要二三十兆打进去包直接肥一圈现在完全没这个问题。我测了十几种场景说说真实表现怎么样我专门找了各种奇奇怪怪的图来测不是官方那种摆拍的样张就是手机里真实拍的东西能打满分的场景打印的文档、PPT、书本文字几乎100%准确率排版都不乱连段落换行都给你保留了路牌、店铺招牌、菜单不管白天晚上只要字够大基本全对快递单、小票、处方单只要是打印的歪个二三十度完全没事它自己会矫正电脑屏幕截图连小字都能认出来复制代码比敲方便多了中日韩英混排我找了张日本便利店的小票中文英文日文混在一起识别得明明白白会翻车的场景手写体别想了尤其是医生那种草书基本认不出来官方文档也明说了只支持印刷体这点不骗人角度太歪超过正负30度正确率直线下降所以我在APP里加了个手动旋转的控件歪太狠了让用户转一下反光严重比如玻璃上的字或者屏幕拍出来有摩尔纹会认错几个字字特别小分辨率低于720p的图确实不行放大了糊它也认不出来艺术字、花体字认不出来很正常人眼有时候都费劲透视矫正前后对比——左侧是倾斜有阴影的原始照片右侧是矫正后的平整扫描件:黑白文档增强效果对比——左为发灰有阴影的原图右为增强后的纯黑白扫描件这里有个细节我特别喜欢返回结果不止是一整段文字每个字、每一行都带坐标和置信度。interfaceTextRecognitionResult{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}fromkit.CoreVisionKit;constresultawaitimageProcessing.superResolution({pixelMap:lowResPixelMap,scale:4// 目前支持4倍});// result.pixelMap 就是超分后的图我一开始测的是表情包群里存的那种糊得看不清脸的老表情包4倍放大之后居然真的清晰了边缘锐化得很自然没有那种过度锐化的锯齿感。真正让我觉得牛的是我翻出来一张2018年拍的板书当时坐后排用旧手机拍的糊得字都看不清我本来想丢了试了一下超分——一秒钟之后PPT上的字居然能看清了。这个处理速度真的惊到我一张1080p的图超分到4K端侧处理只用了不到一秒钟。我查了一下它是用NPU跑的不是CPU所以不仅快还特别省电手机几乎不发热。我在工具里加了个小功能识别文字的时候如果检测到图片分辨率太低自动弹个提示图片较模糊是否先高清放大再识别点一下一秒钟超分完再识别正确率能提升一大截。这个组合拳打下来体验真的丝滑。当然也有坑超分最大只支持输入短边720像素的图也就是说你本来就是清晰的大图它不让你超只有模糊的小图才能用。一开始我没看文档直接传原图进去报错查了半天才知道有这个限制。想想也合理本来就是用来拯救低清图的高清图再超分也没意义。还有就是不要拿它去超文字特别小的图它会把噪点也一起放大效果反而不好。正确用法是拍糊了的照片、老照片、低清表情包、缩略图这些场景下它真的像魔法一样。最惊喜的文搜图全本地闭环这事儿居然成了三个能力里我本来最不看好文搜图结果玩了一下午发现这个才是真正的杀手功能。什么叫文搜图就是你不用给图片打标签直接在相册搜索框里输入猫就能找出所有带猫的照片输入海滩所有海边的照片都出来输入去年在武汉吃的热干面它真的能给你找出来。以前这个功能只有大厂相册能做而且基本都是把图片传到云端服务器算完给你返回结果。且不说隐私问题个人开发者根本做不了——你总不能让用户把所有照片都传到你的服务器吧流量费你都出不起。现在API 26直接把这个能力下放到端侧了全程本地算数据不出设备。接入同样简单得离谱import{imageSearch}fromkit.CoreVisionKit;// 第一步建索引把要搜的图片加进去awaitimageSearch.addImage({uri:photoUri,label:photoName// 可选自带的标签});// 第二步搜索传自然语言constresultsawaitimageSearch.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这个版本值得认真做。