From: Vincent Vanwaelscappel Date: Tue, 26 Nov 2019 20:46:39 +0000 (+0100) Subject: wip #3206 @3 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=b1e6ddeb0f1d65050ab3621205aa0eb75f636206;p=1000pourcent.git wip #3206 @3 --- diff --git a/_doc/areas.psd b/_doc/areas.psd new file mode 100644 index 0000000..80a0632 Binary files /dev/null and b/_doc/areas.psd differ diff --git a/index.html b/index.html index c041752..b50cec9 100644 --- a/index.html +++ b/index.html @@ -6,8 +6,8 @@ - + diff --git a/js/1000pct.js b/js/1000pct.js index 8feebd8..a96b778 100644 --- a/js/1000pct.js +++ b/js/1000pct.js @@ -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); diff --git a/js/ocr.js b/js/ocr.js index c278b71..9b0be4e 100644 --- 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 diff --git a/js/perspective.js b/js/perspective.js index e6633ad..88cbf34 100644 --- a/js/perspective.js +++ b/js/perspective.js @@ -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); }