]> _ Git - 1000pourcent.git/commitdiff
wip #3206 @3
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 26 Nov 2019 20:46:39 +0000 (21:46 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 26 Nov 2019 20:46:39 +0000 (21:46 +0100)
_doc/areas.psd [new file with mode: 0644]
index.html
js/1000pct.js
js/ocr.js
js/perspective.js

diff --git a/_doc/areas.psd b/_doc/areas.psd
new file mode 100644 (file)
index 0000000..80a0632
Binary files /dev/null and b/_doc/areas.psd differ
index c04175291781e168ece1b337e4c73295dbb8d157..b50cec97d0b6bed528cae381bfec77abe29f6141 100644 (file)
@@ -6,8 +6,8 @@
     <link href="style.css" rel="stylesheet" type="text/css">
 </head>
 <body>
-<script async src='js/tesseract.min.js'></script>
 <script async src="js/opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
+<script async src='https://unpkg.com/tesseract.js@v2.0.0-beta.1/dist/tesseract.min.js' onload="onTesseractReady();"></script>
 <script src="js/1000pct.js"></script>
 <script src="js/perspective.js"></script>
 <script src="js/ocr.js"></script>
index 8feebd8886209fa702a28b6d246ed62707aa7dc0..a96b778c409ecdc1bffaa0df69fa0fad20d1d5de 100644 (file)
@@ -1,5 +1,6 @@
 var opencvReferences = [];
 
+
 function onOpenCvReady() {
     drawImage('assets/inputsmall.jpg', 'input', function (width, height) {
         setTimeout(function () {
@@ -13,6 +14,8 @@ function onOpenCvReady() {
     });
 }
 
+
+
 function drawImage(url, id, callback) {
     var img = new Image();
     img.setAttribute('id', id);
index c278b71d890e4689aa1c4f47e30cd45064c1af63..9b0be4ebe0fb66eaa94a1cf9feb61a82bf593af0 100644 (file)
--- a/js/ocr.js
+++ b/js/ocr.js
@@ -1,3 +1,97 @@
+function onTesseractReady() {
+
+    window.tesseractWorker = new Tesseract.createWorker();
+
+    (async () => {
+        await window.tesseractWorker.load();
+        await window.tesseractWorker.loadLanguage('eng');
+        await window.tesseractWorker.initialize('eng');
+        await window.tesseractWorker.setParameters({
+            tessedit_char_whitelist: '0123456789?',
+        });
+    })();
+}
+
 function recognizeChars(canvas) {
+    let src = cv.imread(canvas);
+    var areas = {
+        'blue': {
+            'bonus': [333, 588, 40, 53, 0],
+            'malus': [333, 497, 40, 53, 0],
+            'number': [279, 550, 148, 38, 0],
+        },
+        'red': {
+            'bonus': [586, 333, 53, 40, 270],
+            'malus': [497, 333, 53, 40, 270],
+            'number': [543, 279, 38, 148, 270],
+        },
+        'yellow': {
+            'bonus': [333, 67, 40, 53, 180],
+            'malus': [333, 158, 40, 53, 180],
+            'number': [279, 120, 148, 38, 180],
+        },
+        'green': {
+            'bonus': [63, 333, 53, 40, 90],
+            'malus': [154, 333, 53, 40, 90],
+            'number': [116, 282, 38, 148, 90],
+        },
+    }
+
+    window.regions = {};
+    for (let color in areas) {
+        regions[color] = {};
+        for (let area in areas[color]) {
+            extractRegion(src, areas[color][area], color, area);
+        }
+    }
+}
+
+
+function extractRegion(src, region, color, area) {
+    let drawId = 'color_' + color + '_area';
+
+    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]});
+    let M = cv.getRotationMatrix2D(center, region[4], 1);
+    M.data64F[2] += (bbox.width - w) / 2;
+    M.data64F[5] += (bbox.height - h) / 2;
+    cv.warpAffine(dst, res, M, bbox, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar());
+
+    let canvas = getCanvas(drawId);
+    cv.imshow(canvas, res);
+
+    ocr(canvas.toDataURL(), color, area);
+}
 
+function ocr(image, color, area) {
+    (async () => {
+        const {data: {text}} = await window.tesseractWorker.recognize(image);
+        console.log(text);
+        regions[color][area] = text;
+        await window.tesseractWorker.terminate();
+    })();
+    // try {
+    //     Tesseract.recognize(
+    //         image,
+    //         'eng',
+    //         {logger: m => console.log(m)}
+    //     ).then(({data: {text}}) => {
+    //         regions[color][area] = text;
+    //     })
+    // } catch (e) {
+    //
+    // }
 }
\ No newline at end of file
index e6633ad00b5c488312301ddcaa0bd8d5db1ee15c..88cbf3474fe8cd3ba45efbc96a6598f165f3ee2b 100644 (file)
@@ -78,10 +78,16 @@ function correctPerspective(contours) {
     } else if (br === corner1) {
         rotate = 90;
     }
+    rotate += 45;
+
     let center = new cv.Point(finalSize / 2, finalSize / 2);
     let M1 = cv.getRotationMatrix2D(center, rotate, 1);
+    // Find box in order the rotated board fit
+    let bbox = cv.RotatedRect.boundingRect({center: center, size: boardSize, angle: rotate});
+    M1.data64F[2] += (bbox.width - finalSize) / 2;
+    M1.data64F[5] += (bbox.width - finalSize) / 2;
     let board = cv.Mat.zeros(finalSize, finalSize, cv.CV_8UC3);
-    cv.warpAffine(boardSized, board, M1, boardSize, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar());
+    cv.warpAffine(boardSized, board, M1, bbox, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar());
     cv.imshow(getCanvas('perspective'), board);
 }