有个项目需求用到手写识别功能,即H5识别用户手写的文字内容。参考案例为“2018政府工作报告关键字”,扫描下面二维码体验,
重点为找到合适的文字识别接口,通过查询,市面上已有腾讯AI、百度AI、科大讯飞的文字识别接口,通过测试结果均不理想,这些接口的实现原理都是识别图片上的文字内容转换为文本。
后经分析参考案例,其使用的为汉王云API,实现原理是识别手写轨迹,通过测试其准确率是极高的。
第一步,根 API文档 接口使用说明,在前端记录手写轨迹串"x1,y1,x2,y2,x3,y3,x4,y4......-1,0",轨迹以:"-1,0"结尾。
第二步,调用简体中文接口地址:http(s)://api.hanvon.com/rt/ws/v1/hand/single?key=xxx&code=83b798e7-cd10-4ce3-bd56-7b9e66ace93d,传參。
请求参数示例如下,
{
"uid": "118.12.0.12",
"type": "1",
"data": "76.55,79.55,51.7,119.35,43.75,129.3,-1,0"
}
具体的接口代码在文档PHP示例里写的很清楚,这里不再赘述。
第三步,将接口返回的base64加密的字符串值,通过 base64解码 -> 10进制字符数组 -> 16进制字符数组 -> unicode解码,转成汉字字符数组,具体实现代码如下,
// echo $output;
// base64解码
$strJson = base64_decode($output);
$jsonArr = json_decode($strJson, true);
if($jsonArr["code"] == 0){ // code为0识别成功
$wordArr = explode(",", $jsonArr["result"]); // 转成10进制字符数组
$wordArr = array_filter($wordArr); // 除去数组中的空字符元素
if(count($wordArr) > 0){
$result['wordArr'] = decimalDecode($wordArr); // 将10进制字符数组解码成汉字数组
}else{ // 识别文字为空
}
}else{ // 识别失败
}
// 10进制字符数组解码成汉字数组
function decimalDecode($wordArrDec){
$wordArrHex = array();
for($i = 0; $i < count($wordArrDec); $i++){
array_push($wordArrHex, unicodeDecode("\u".dechex($wordArrDec[$i]))); // 先将10进制字符转成16进制字符
}
return $wordArrHex;
}
// 16进制字符unicode解码成汉字字符
function unicodeDecode($unicode_str){
$json = '{"str":"'.$unicode_str.'"}';
$arr = json_decode($json,true);
if(empty($arr)) return '';
return $arr['str'];
}
使用接口需要在汉王云购买服务或者申请免费额度200次/天。
汉王云-云手写单字API详情:http://developer.hanvon.com/api/toAPIinfo.do?id=1
优图OCR-腾讯AI开放平台:https://ai.qq.com/product/ocr.shtml#handwrite
百度AI开放平台-文字识别API文档:http://ai.baidu.com/docs#/OCR-API/top
手写文字识别 · 科大讯飞REST_API开发指南:https://doc.xfyun.cn/rest_api/手写文字识别.html
Egret你画我猜~源码分享:https://bbs.egret.com/forum.php?mod=viewthread&tid=27892
egret 涂鸦分享:https://bbs.egret.com/thread-30686-1-1.html
PHP中10进制与16进制互转 - PHP - PHPcode:https://www.form1.cn/php-phpcode-246.html
PHP解码unicode编码中文字符代码示例 - un123 - 博客园:https://www.cnblogs.com/cfinder010/p/3911596.html