From 0c43ae696943e90a5a24e037919aedfbd9ba2b4f Mon Sep 17 00:00:00 2001 From: sumedhghaisas Date: Thu, 3 Mar 2016 12:24:43 +0530 Subject: [PATCH] Making cmake-js install globally --- cmake_install.js | 9 ++++-- example.js | 12 ++++++-- package.json | 2 +- sample_images/3.jpg | Bin 31430 -> 27107 bytes src/ocr/ocr.cpp | 63 +++++++++++++++----------------------- src/ocr/ocr.hpp | 4 +-- src/sync.cc | 37 +++++++++++++++------- src/util/decoded_text.hpp | 24 ++++----------- 8 files changed, 75 insertions(+), 76 deletions(-) diff --git a/cmake_install.js b/cmake_install.js index 8fda04e..aee98c6 100644 --- a/cmake_install.js +++ b/cmake_install.js @@ -3,6 +3,7 @@ var https = require('https'); var fs = require('fs'); var tar = require('tar'); var child_process = require('child_process'); +var http = require('http'); function onError(err) { console.error('An error occurred:', err) @@ -33,6 +34,8 @@ function downloadAndRun(filename, type, folder, url) { var tmpFilePath = filename + "." + type; + console.log(url); + https.get(url, function(response) { response.on('data', function (data) { fs.appendFileSync(tmpFilePath, data) @@ -43,9 +46,9 @@ function downloadAndRun(filename, type, folder, url) { var zip = new AdmZip(tmpFilePath); zip.extractAllTo("./"); - fs.unlink(tmpFilePath); + //fs.unlink(tmpFilePath); fs.renameSync('./' + folder, './cmake_binary'); - runCmakeJS('.\\node_modules\\.bin\\cmake-js.cmd', 'cmake.exe', '\\'); + runCmakeJS('cmake-js', 'cmake.exe', '\\'); } else if(type == "tar.gz") { @@ -53,7 +56,7 @@ function downloadAndRun(filename, type, folder, url) ls.stdout.on("end", function() { fs.unlink(tmpFilePath); fs.renameSync('./' + folder, './cmake_binary'); - runCmakeJS('./node_modules/cmake-js/bin/cmake-js', 'cmake', '/'); + runCmakeJS('cmake-js', 'cmake', '/'); }); } else diff --git a/example.js b/example.js index bfdafed..68f9582 100644 --- a/example.js +++ b/example.js @@ -1,8 +1,16 @@ 'use strict'; var sceneText = require('bindings')('node_text_detector'); var util = require('util'); +var fs = require('fs'); var result; console.log('-----------------------------------------------------'); -result = sceneText.GetTextSync('sample_images/3.jpg', __dirname); -console.log(util.inspect(result, {depth: 9, colors: true})); \ No newline at end of file +fs.readFile('./sample_images/3.jpg', function(error, data) { + if (!error) { + var result = sceneText.GetTextSync(data, __dirname, '0123456789ABCDEFGHJKLMNPRSTUVWXYZ'); + console.log(util.inspect(result, {depth: 9, colors: true})); + } else { + console.log('Load Image from Path failed'); + return undefined; + } +}); \ No newline at end of file diff --git a/package.json b/package.json index 1a518a7..11c6568 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "bindings":"latest" }, "scripts": { - "install": "node cmake_install.js", + "install": "npm install -g cmake-js && node cmake_install.js", "test" : "node example.js" } } diff --git a/sample_images/3.jpg b/sample_images/3.jpg index 3aa0223d7acfab1f54ba0e7bca3b74646eace622..8ff8e1e2cc3f23d0f5a7010c6edf503b175a989e 100644 GIT binary patch literal 27107 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 L*AQ3}_&fD~^8;&v diff --git a/src/ocr/ocr.cpp b/src/ocr/ocr.cpp index 1d62bf8..a844829 100644 --- a/src/ocr/ocr.cpp +++ b/src/ocr/ocr.cpp @@ -42,20 +42,6 @@ class Regions{ vector< vector > region_groups; }; -class decodedTxtRegion{ - public: - int x1,x2,y1,y2; - vector words; - vector confidences; -}; - -class outputOCR{ - public: - int x1,x2,y1,y2; - vector decodedText; - -}; - Rect groups_draw(Mat &src, vector &groups); void er_show(vector &channels, vector > ®ions); @@ -64,14 +50,14 @@ void er_draw(vector &channels, vector > ®ions, vector computeGroupsWithMinArea(Mat &src,vector &channels,float minArea); -vector doOCR(string languageFile, Mat &image,vector channels,vector > regions,vector< vector > nm_region_groups,vector nm_boxes); +vector doOCR(string languageFile, string whitelist, Mat &image,vector channels,vector > regions,vector< vector > nm_region_groups,vector nm_boxes); Regions computeRegionGroups(Mat &src,vector &channels,float minArea); -OutputOCR detectAndDecode(string languageFile, Mat &src); - +OutputOCR detectAndDecode(string languageFile, string whitelist, Mat &src); -outputOCR Ocr(string path,Rect box) { +/* +OutputOCR Ocr(string path,Rect box) { // namedWindow("grouping",WINDOW_NORMAL); // read the image Mat src = imread(path); @@ -111,9 +97,9 @@ outputOCR Ocr(string path,Rect box) { outputOCR output; output.decodedText=decodedTxtRegions; return output; -} +}*/ -OutputOCR* Ocr(char* buffer, unsigned int len, string languageFile) +OutputOCR* Ocr(char* buffer, unsigned int len, string languageFile, string whitelist) { Mat temp(1, len, CV_8UC3, buffer); Mat src = imdecode(temp, 1); @@ -122,10 +108,10 @@ OutputOCR* Ocr(char* buffer, unsigned int len, string languageFile) LOG << "Unable to load image." << endl; return NULL; } - return new OutputOCR(detectAndDecode(languageFile, src)); + return new OutputOCR(detectAndDecode(languageFile, whitelist, src)); } -OutputOCR* Ocr (string path, string languageFile) { +OutputOCR* Ocr (string path, string languageFile, string whitelist) { // namedWindow("grouping",WINDOW_NORMAL); //Mat src = imread(path); char* buffer = NULL; @@ -158,10 +144,10 @@ OutputOCR* Ocr (string path, string languageFile) { LOG << src.type() << endl; LOG << CV_8UC3 << endl; LOG << "image loaded" << endl; - return new OutputOCR(detectAndDecode(languageFile, src)); + return new OutputOCR(detectAndDecode(languageFile, whitelist, src)); } -OutputOCR detectAndDecode(string languageFile, Mat &src){ +OutputOCR detectAndDecode(string languageFile, string whitelist, Mat &src){ // Extract channels to be processed individually vector channels; @@ -188,7 +174,7 @@ OutputOCR detectAndDecode(string languageFile, Mat &src){ // draw groups Rect group_box= groups_draw(src, groups_boxes); imwrite("save.jpg",src); - vector decodedTxt=doOCR(languageFile, src,channels,region.regions,region.region_groups,groups_boxes); + vector decodedTxt=doOCR(languageFile, whitelist, src,channels,region.regions,region.region_groups,groups_boxes); OutputOCR output(Box(group_box.tl().x, group_box.br().x, group_box.tl().y, group_box.br().y), decodedTxt); @@ -200,11 +186,11 @@ OutputOCR detectAndDecode(string languageFile, Mat &src){ } return output; } -vector doOCR(string languageFile, Mat &image,vector channels,vector > regions,vector< vector > nm_region_groups,vector nm_boxes){ +vector doOCR(string languageFile, string whitelist, Mat &image,vector channels,vector > regions,vector< vector > nm_region_groups,vector nm_boxes){ // Text Recognition (OCR) double t_r = (double)getTickCount(); - Ptr ocr = OCRTesseract::create(languageFile.c_str()); + Ptr ocr = OCRTesseract::create(languageFile.c_str(), NULL, whitelist.c_str()); string output; Mat out_img; Mat out_img_detection; @@ -236,10 +222,19 @@ vector doOCR(string languageFile, Mat &image,vector channels,v vector confidences; ocr->run(group_img, output, &boxes, &words, &confidences, OCR_LEVEL_WORD); + string word = ""; + for(auto it = words.begin();it != words.end();it++) + word += *it; + float confidence = 0; + for(auto it = confidences.begin();it != confidences.end();it++) + if(*it > confidence) + confidence = *it; + output.erase(remove(output.begin(), output.end(), '\n'), output.end()); - LOG << "OCR output = \"" << output << "\" length = " << output.size() << endl; + LOG << "OCR output = \"" << output << "\" length = " << output.size() << " confidence = " << confidence << endl; - decodedTxtRegions.push_back(DecodedText(Box(nm_boxes[i].tl().x, nm_boxes[i].br().x, nm_boxes[i].tl().y, nm_boxes[i].br().y), words, confidences)); + if(words.size() != 0) + decodedTxtRegions.push_back(DecodedText(Box(nm_boxes[i].tl().x, nm_boxes[i].br().x, nm_boxes[i].tl().y, nm_boxes[i].br().y), word, confidence)); } return decodedTxtRegions; } @@ -371,13 +366,3 @@ void er_draw(vector &channels, vector > ®ions, vector 1){ - //detectRegions = To(info[1]).FromJust(); + OutputOCR* decodedText = NULL; + if(!node::Buffer::HasInstance(info[0])) + { + // get the value of path + Utf8String *utfPath = new Utf8String(info[0]); + Utf8String *utfLanguageFile = new Utf8String(info[1]); + Utf8String *utfWhitelist = new Utf8String(info[2]); + string path(**utfPath); + string languageFile(**utfLanguageFile); + string whitelist(**utfWhitelist); + + decodedText = Ocr(path, languageFile, whitelist); } - // call the decoder here - OutputOCR* decodedText = Ocr(path, languageFile); + else + { + char* image = (char*)node::Buffer::Data(info[0]->ToObject()); + unsigned int len = node::Buffer::Length(info[0]->ToObject()); + Utf8String *utfLanguageFile = new Utf8String(info[1]); + Utf8String *utfWhitelist = new Utf8String(info[2]); + string languageFile(**utfLanguageFile); + string whitelist(**utfWhitelist); + + decodedText = Ocr(image, len, languageFile, whitelist); + } + if(decodedText == NULL) - info.GetReturnValue().Set(Nan::New()); + info.GetReturnValue().Set(Nan::Undefined()); else info.GetReturnValue().Set(Nan::New(decodedText->ToLocal())); + delete decodedText; } diff --git a/src/util/decoded_text.hpp b/src/util/decoded_text.hpp index f9b7446..4dedbd5 100644 --- a/src/util/decoded_text.hpp +++ b/src/util/decoded_text.hpp @@ -10,34 +10,22 @@ struct DecodedText { - DecodedText(Box box, std::vector words, std::vector confs) - : box(box), words(words), confs(confs) {} + DecodedText(Box box, std::string word, float conf) + : box(box), word(word), conf(conf) {} Box box; - std::vector words; - std::vector confs; + std::string word; + float conf; v8::Local object; v8::Local ToLocal() { v8::Local l_box = box.ToLocal(); - v8::Local l_words = Nan::New(); - v8::Local l_confs = Nan::New(); - - for(int i = 0;i < words.size();i++) - { - Nan::Set(l_words, i, Nan::New(words[i]).ToLocalChecked()); - } - - for(int i=0;i out = Nan::New(); Nan::Set(out, Nan::New("box").ToLocalChecked(), l_box); - Nan::Set(out, Nan::New("words").ToLocalChecked(), l_words); - Nan::Set(out, Nan::New("confidences").ToLocalChecked(), l_confs); + Nan::Set(out, Nan::New("value").ToLocalChecked(), Nan::New(word.c_str()).ToLocalChecked()); + Nan::Set(out, Nan::New("confidence").ToLocalChecked(), Nan::New(conf)); return out; } };