1. 程式人生 > >Node+OCR(影象文字識別)

Node+OCR(影象文字識別)

開發目的

這算是node應用的第二個小應用吧,主要目的是熟悉node和express框架。原理很簡單:在node搭建的環境下引用第三方包處理圖片資料並返回給前臺資訊。 
實現效果,百度提供的圖片識別,經過測試識別車牌號等規範文字數字還是比較準確的

環境需求

1.Express 是一個非常流行的node.js的web框架。基於connect(node中介軟體框架)。提供了很多便於處理http請求等web開發相關的擴充套件。 
2.OCR: 
通用文字識別 Node SDK目錄結構:


├── src
    │  ├── auth                                //授權相關類
    │  ├── http                                //Http通訊相關類
    │  ├── client                              //公用類
    │  ├── util                                //工具類
    │  └── const                               //常量類
    ├── AipOcr.js                      //通用文字識別互動類
    ├── index.js                               //入口檔案
    └── package.json                           //npm包描述檔案
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

支援 node 版本 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: 

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搭建就不再做詳細介紹了,上一篇部落格已有哦~~

功能實現

前端上傳圖片後端處理:


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);
        })
    });
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

圖片處理核心模組:


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);
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

獲取到的base64圖片資料和res物件作為闡述傳遞給ocr提供好的方法, 

寧波好的整形醫院http://www.iyestar.com/
寧波最好的整形醫院http://www.iyestar.com/
回撥產生的資料將作為結果返回給前端。 
####小彩蛋: 
nodeJs中commonJs規範如何實現的?

1.Node程式由許多個模組組成,每個模組就是一個檔案。Node模組採用了CommonJS規範。 
2.module物件,Node內部提供一個Module構建函式。所有模組都是Module的例項。每個模組內部,都有一個module物件,代表當前模組。它有以下屬性。

module.id 模組的識別符,通常是帶有絕對路徑的模組檔名。
module.filename 模組的檔名,帶有絕對路徑。
module.loaded 返回一個布林值,表示模組是否已經完成載入。
module.parent 返回一個物件,表示呼叫該模組的模組。
module.children 返回一個數組,表示該模組要用到的其他模組。
module.exports 表示模組對外輸出的值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.呼叫:根據模組名稱作為物件呼叫其內自定義的方法即可。

global.nodeServer.getResult(res,imgName);

前端js程式碼就不貼了 so~easy

效果展示

這裡寫圖片描述