UNPKG

@lzwme/captcha-cv-ocr

Version:

Verification code identification based on OCR (Tesseract) and CV (OpenCV)

66 lines (64 loc) 3.01 kB
const math = require("mathjs"); var main = { transformMath: ({buffer, size}) => { var unit8 = new Uint8Array(buffer); var sz = [size.height, size.width]; var arr = Array.from(unit8); var mat = math.reshape(arr, sz); return {mat, sz}; }, transformBuffer: ({mat, sz}) => { var arr = math.reshape(math.clone(mat), [-1]).valueOf(); return {buffer: new Uint8Array(arr), size: {height: sz[0], width: sz[1]}}; }, inverse: ({mat, sz}) => { return({mat: math.add(255, math.dotMultiply(mat, -1)), sz}); }, dilateOrErode: ({mat, sz}, element, stat) => { var szElement = math.size(element).valueOf(); var szMat2 = [sz[0] - szElement[0] + 1, sz[1] - szElement[1] + 1]; var mat2 = math.zeros(szMat2[0], szMat2[1]); mat2 = math.map(mat2, (value, index, matrix) => { var index2 = math.add(index, szElement, -1).valueOf(); var range = [math.range(index[0], index2[0], true), math.range(index[1], index2[1], true)]; var matTemp = math.subset(mat, math.index(range[0], range[1])); matTemp = math.dotMultiply(math.dotMultiply(matTemp, element), stat); return math.max(matTemp); }); return {mat: math.dotMultiply(mat2, stat), sz: szMat2}; }, erode: (imageMath, element) => main.dilateOrErode(imageMath, element, -1), dilate: (imageMath, element) => main.dilateOrErode(imageMath, element, 1), connectedComponents: ({mat, sz}) => { var tool = require("./new_connected_component_labeling_algorithm_for_binary_image"); return tool(mat.valueOf(), sz); }, rectangle: ({mat, sz}, points, color = 200) => { var mat2 = math.clone(mat); for(let i = 0; i < points.length; i++){ var pointA = points[i][0]; var pointB = points[i][0]; for(let j = 1; j < points[i].length; j++){ pointA = pointB; pointB = points[i][j]; if (pointB[0] - pointA[0] != 0){ var k = (pointB[1] - pointA[1]) / (pointB[0] - pointA[0]); var b = pointA[1] - k * pointA[0]; var x = pointA[0] <= pointB[0] ? math.range(pointA[0], pointB[0], true) : math.range(pointA[0], pointB[0], -1, true); x = x.valueOf(); var y = math.round(math.add(math.dotMultiply(k, x), b)); y = y.valueOf(); } else{ var y = pointA[1] <= pointB[1] ? math.range(pointA[1], pointB[1], true) : math.range(pointA[1], pointB[1], -1, true); y = y.valueOf(); var x = math.dotMultiply(math.ones(math.size(y)), pointA[0]); x = x.valueOf(); } for(let l = 0; l < x.length; l++) mat2.subset(math.index(x[l], y[l]), color); } } return {mat: mat2, sz}; }, math: math }; module.exports = main;