From 1331471ac2685950997a423c4331348ee1e3a75d Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 28 Nov 2019 17:59:33 +0100 Subject: [PATCH] wip #3222 @1 --- assets/font.traineddata | Bin 0 -> 137228 bytes assets/font.traineddata.gz | Bin 0 -> 14835 bytes index.html | 2 +- js/1000pct.js | 2 +- js/ocr.js | 41 ++++++++++++++++++++++--------------- js/perspective.js | 2 +- 6 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 assets/font.traineddata create mode 100644 assets/font.traineddata.gz diff --git a/assets/font.traineddata b/assets/font.traineddata new file mode 100644 index 0000000000000000000000000000000000000000..2ef9bf762e10875fa175d8df47883ad455c1aeca GIT binary patch literal 137228 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 literal 0 HcmV?d00001 diff --git a/assets/font.traineddata.gz b/assets/font.traineddata.gz new file mode 100644 index 0000000000000000000000000000000000000000..bbdefb1f6a4e99bd17da9c6d534a9476187ef31c GIT binary patch literal 14835 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 F{s$8Mqvikr literal 0 HcmV?d00001 diff --git a/index.html b/index.html index b50cec9..48b4f42 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ - + diff --git a/js/1000pct.js b/js/1000pct.js index a96b778..21f33ed 100644 --- a/js/1000pct.js +++ b/js/1000pct.js @@ -1,7 +1,7 @@ var opencvReferences = []; -function onOpenCvReady() { +function appReady() { drawImage('assets/inputsmall.jpg', 'input', function (width, height) { setTimeout(function () { var start = Date.now(); diff --git a/js/ocr.js b/js/ocr.js index 91edaa7..f29e789 100644 --- a/js/ocr.js +++ b/js/ocr.js @@ -1,14 +1,18 @@ function onTesseractReady() { - - window.tesseractWorker = new Tesseract.createWorker(); + console.log('onTesseractReady()'); (async () => { - await window.tesseractWorker.load(); - await window.tesseractWorker.loadLanguage('eng'); - await window.tesseractWorker.initialize('eng'); - await window.tesseractWorker.setParameters({ - tessedit_char_whitelist: '0123456789?', - }); + window.tesseractScheduler = Tesseract.createScheduler(); + for (let i = 0; i < 4; i++) { + let worker = Tesseract.createWorker({ + langPath:'./assets/', + }); + await worker.load(); + await worker.loadLanguage('font'); + await worker.initialize('font'); + tesseractScheduler.addWorker(worker); + } + appReady(); })(); } @@ -50,18 +54,20 @@ function recognizeChars(canvas) { function extractRegion(src, region, color, area) { let drawId = 'color_' + color + '_area'; + var coef = 1000 / 500; + region[0] *= coef; + region[1] *= coef; + region[2] *= coef; + region[3] *= coef; + let rect = new cv.Rect(region[0], region[1], region[2], region[3]); let dst = src.roi(rect); - // if (region[4] === 90 || region[4] === 270) { - // cv.imshow(getCanvas('c_' + drawId), dst); - // } let res = new cv.Mat(); let w, h; w = region[2]; h = region[3]; - let size = new cv.Size(w, h); let center = new cv.Point(w / 2, h / 2); let bbox = cv.RotatedRect.boundingRect({center: center, size: size, angle: region[4]}); @@ -75,9 +81,9 @@ function extractRegion(src, region, color, area) { // Grayscale cv.cvtColor(res, res, cv.COLOR_RGBA2GRAY, 0); // Brightness - cv.convertScaleAbs(res, res,2,100); + cv.convertScaleAbs(res, res, 1.9, 100); // Contrast - cv.equalizeHist(res, res); + cv.equalizeHist(res, res); let canvas = getCanvas(drawId); cv.imshow(canvas, res); @@ -86,11 +92,12 @@ function extractRegion(src, region, color, area) { } function ocr(image, color, area) { + let worker = new Tesseract.createWorker(); + (async () => { - const {data: {text}} = await window.tesseractWorker.recognize(image); - console.log(text); + const {data: {text}} = await window.tesseractScheduler.addJob('recognize', image); + console.log(color, area, text); regions[color][area] = text; - await window.tesseractWorker.terminate(); })(); // try { // Tesseract.recognize( diff --git a/js/perspective.js b/js/perspective.js index 88cbf34..22c66cc 100644 --- a/js/perspective.js +++ b/js/perspective.js @@ -61,7 +61,7 @@ function correctPerspective(contours) { cv.warpPerspective(src, finalDest, M, dsize, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar()); // Resize the board to be a square - var finalSize = 500; + var finalSize = 1000; let boardSized = cv.Mat.zeros(finalSize, finalSize, cv.CV_8UC3); let boardSize = new cv.Size(finalSize, finalSize) cv.resize(finalDest, boardSized, boardSize, 0, cv.INTER_LINEAR); -- 2.39.5