本文介绍如何使用Node.js和Express框架,结合百度通用文字识别Node SDK实现图片上传与文字识别功能。内容涵盖环境搭建、SDK安装配置、AipOcrClient客户端初始化、图片Base64处理及后端接口实现,并简要解析Node.js的CommonJS模块机制。
项目背景与目标
开发背景
这是基于Node.js开发的第二个小型应用,主要目的是熟悉Node.js和Express框架的使用。其核心原理是在Node环境下引入第三方SDK处理图片数据,并将识别结果返回给前端页面。
关于识别效果,经测试,百度提供的图片识别接口在识别车牌号等规范文字和数字时具有较高的准确性。
环境配置与SDK安装
环境准备
Express是一个广泛使用的Node.js Web框架,基于connect中间件框架构建,提供了大量用于处理HTTP请求等Web开发任务的扩展功能。
OCR(光学字符识别)模块:
通用文字识别Node SDK的标准目录结构如下:
├── src │ ├── auth //授权相关类 │ ├── http //Http通信相关类 │ ├── client //公用类 │ ├── util //工具类 │ └── const //常量类 ├── AipOcr.js //通用文字识别交互类 ├── index.js //入口文件 └── package.json //npm包描述文件
该SDK支持Node.js 4.0及以上版本。使用Node开发包的具体步骤如下:
1. 从官方网站下载Node SDK压缩包。 2. 将下载的aip-node-sdk-version.zip解压,并复制到项目文件夹中。 3. 进入解压后的目录,执行npm install命令安装SDK依赖库。 4. 将目录作为模块依赖引入项目。
其中version代表版本号,添加完成后,即可在工程中使用通用文字识别Node SDK。
此外,也可以直接通过npm安装依赖:
npm install baidu-aip-sdk(尝试没有成功)
AipOcrClient是Optical Character Recognition的Node客户端,为使用Optical Character Recognition的开发人员提供了一系列的交互方法。
用户可以参考如下代码新建一个AipOcrClient:
AipOcrClient初始化
var AipOcrClient = require("baidu-aip-sdk").ocr;
// 设置APPID/AK/SK
var APP_ID = "你的 App ID";
var API_KEY = "你的 Api Key";
var SECRET_KEY = "你的 Secret Key";
var client = new AipOcrClient(APP_ID, API_KEY, SECRET_KEY);
Express搭建就不再做详细介绍了,上一篇博客已有哦~~
功能实现
前端上传图片后端处理:
图片上传与OCR处理接口
router.route("/uploadPhoto").get(function(req,res){ // 到达此路径则渲染register文件,并传出title值供 register.html使用
res.render("uploadPhoto",{title:'图片文字识别',message:""});
}).post(function(req,res){
// 跨域
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
let form = new formidable.IncomingForm();
form.encoding = 'utf-8'; // 编码
form.keepExtensions = true; // 保留扩展名
form.maxFieldsSize = 2 * 1024 * 1024; // 文件大小
form.uploadDir = 'F:/nodejs/ocrCheck/assets/OCR' // 存储路径
form.parse(req,function(err,fileds,files){ // 解析 formData数据
if(err){ return console.log(err) }
let imgPath = files.img.path // 获取文件路径
let imgName = "F:/nodejs/ocrCheck/assets/OCR/test." + files.img.type.split("/")[1] // 修改之后的名字
let data = fs.readFileSync(imgPath) // 同步读取文件
fs.writeFile(imgName,data,function(err){ // 存储文件
if(err){ return console.log(err) }
fs.unlink(imgPath,function(){}) // 删除文件
//上传图片成功返回code:1
//res.json({code:1})
global.nodeServer.getResult(res,imgName);
})
});
});
图片处理核心模块:
module.exports = {
getResult : function(res,imgName){
var image = fs.readFileSync(imgName);
var base64Img = new Buffer(image).toString('base64');
client.generalBasic(base64Img).then(function(result) {
console.log(JSON.stringify(result));
res.json(result);
});
}
}
获取到的base64图片数据和res对象作为阐述传递给ocr提供好的方法, 回调产生的数据将作为结果返回给前端。
####小彩蛋:
nodeJs中commonJs规范如何实现的?
1.Node程序由许多个模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范。 2.module对象,Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,都有一个module对象,代表当前模块。它有以下属性。
Node.js CommonJS模块机制解析
module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 表示模块对外输出的值。
3.调用:根据模块名称作为对象调用其内自定义的方法即可。
global.nodeServer.getResult(res,imgName);
前端js代码就不贴了 so~easy
效果展示

源码:Node_OCR
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。