如何使用 tesseract.js 识别乐透彩票上的日期和数字?
Posted
技术标签:
【中文标题】如何使用 tesseract.js 识别乐透彩票上的日期和数字?【英文标题】:How to use tesseract.js to recognize a date and numbers on a lotto ticket? 【发布时间】:2019-11-27 16:04:35 【问题描述】:我的应用程序尝试识别开奖日期和彩票上的号码。但是,由于门票背景上的图像,我无法检测到日期或数字。如何修改我的代码以实现我的目标?
最初,我试图找到一个 API,它可以接受彩票的条形码并在彩票是否中奖时返回。在对网络进行广泛研究之后,我开始意识到这种方法是不可能的,所以现在我正在尝试使用字符识别方法来检测数字和绘制日期。有了这些信息,我将把它与中奖号码和开奖日期进行交叉引用。 这里的好处是所需的字符是黑色的,而其他所有字符都有不同的颜色。 我尝试使用 this 逻辑,但我很难操纵代码以适应我的目的。
所需的代码将输出“First Draw:”日期和所玩的 6 个号码(在 A06: 的右侧)。
我实际得到的是以下内容:
“不” 低0 “嗯” 3153:» -.: , .4, LDTTU PLUS,.;: 7N9"??? 毫秒:10 20 24 25 32 3.7 总计:R5'00。 7‘ HC? 'E: IWHW 753:” 19 年 15 月 0 日 FE:4¢;1- 071094555258an94
//function I use to run OCR
function runOCR(url)
Tesseract.recognize(url)
.then(function(result)
console.log(result.text);
).progress(function(result)
console.log('Status: ' + result['status']);
);
提前感谢您提供有效的解决方案。 我只需要有人帮助我将红色和白色背景像素化,以便前景变得容易识别。我对这里的两行感兴趣:抽奖日期,即 First Draw: Saterday 20/07/19 和 A06: 10 20 24 25 32 37
【问题讨论】:
很抱歉我不能帮助你,因为这样的问题很少得到回答:/ 你说得很难:`我只需要有人帮助我把红白背景像素化使前景变得容易识别。`。如果您无法区分前景色和背景色,您应该查看thresholding。这是一个很好的video,关于各种图像处理,包括用于阈值处理的工作代码。 我需要一个函数,它会遍历给定图像中的每个像素并将其与黑色值进行比较。如果像素在颜色上等于或大于指定的黑色像素值,则该像素保持其颜色,否则将其更改为白色像素。我的问题是我不知道如何进行这种比较,甚至不知道如何寻找解决方案。您现在知道我需要什么,如果您能为我编写代码,我将不胜感激。谢谢。 这正是我给你的。我可能会看一下,但请您自己尝试一下。 好的。我现在正在编码。谢谢你这么久:) 如何更改 if 条件以测试黑色像素阈值(假设图像中最亮的黑色像素):for(var i = 0; i+3 0 || g > 0 || b > 0) && a > 0) imageData.data[i+3] = 0;。 //抱歉压缩代码。 【参考方案1】:Sooo...好吧,我试了一下。
我首先将图像转换为灰度图像,然后检查该值是高于还是低于阈值。只需上传图像并移动滑块即可更改阈值。
(你可能需要在整页中打开它哈哈)
祝你好运:)
const fileReader = document.getElementById('fileReader');
const sliderThreshold = document.getElementById('sliderThreshold');
const inputCanvas = document.getElementById('inputCanvas');
const outputCanvas = document.getElementById('outputCanvas');
const inputCtx = inputCanvas.getContext('2d');
const outputCtx = outputCanvas.getContext('2d');
sliderThreshold.addEventListener('input', e => displayResult(e.target.value));
fileReader.addEventListener('change', inputEvent =>
let reader = new FileReader();
reader.addEventListener('load', readerEvent =>
let img = new Image();
img.addEventListener('load', () =>
inputCanvas.width = img.width;
inputCanvas.height = img.height;
inputCtx.drawImage(img, 0, 0);
displayResult(50);
);
img.src = readerEvent.target.result;
);
reader.readAsDataURL(inputEvent.target.files[0]);
);
function displayResult(threshold)
let imageData = inputCtx.getImageData(0,0, inputCanvas.width, inputCanvas.height);
let data = imageData.data;
for(let i = 0; i < data.length; i += 4)
// Convert RGB values to grayscale (you can look that up)
let grayscale = data[i] * 0.3 + data[i + 1] * 0.59 + data[i + 2] * 0.11;
// Check if the value is obove or below the threshold value and return white or black
let finalColor = grayscale < threshold ? 0 : 255;
// Asign the color
data[i] = finalColor;
data[i + 1] = finalColor;
data[i + 2] = finalColor;
// Put the data into another canvas so we
outputCanvas.width = imageData.width;
outputCanvas.height = imageData.height;
outputCtx.putImageData(imageData, 0, 0);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.canvasContainer
overflow-y: scroll;
display: inline-block;
</style>
</head>
<body>
<input type="file" id="fileReader">
Threshold<input type="range" min="0" max="255" id="sliderThreshold">
<div class="canvasContainer">
<canvas id="outputCanvas"></canvas>
</div>
<div class="canvasContainer">
<canvas id="inputCanvas"></canvas>
</div>
<script src="./index.js"></script>
</body>
</html>
【讨论】:
嘿,我想知道我能不能问你一些关于训练数据的问题? (我不能再问问题了。) 当然可以 :) 这不是我的专长。 (为什么你不能再问问题了?) 你太棒了!我在网站上使用 tesseract cdn,现在我想使用我自己的训练数据语言,但识别功能似乎没有使用它。我创建了一个设置变量来设置 eng.traineddata.gz 所在的路径,并将 var 作为识别方法的第二个参数传递。当我只传递图像时,我得到了相同的结果。我在 Windows 中测试了 tesseract 并用我自己的替换了训练数据文件并得到了我想要的。我应该怎么做才能让 tesseract 使用我训练过的数据语言? (我想我现在改变了问题主题,我被禁止提问 6 分钟) 也许 Tesseract 将我的训练数据添加到他们的数据中,所以我只想要它只使用我的语言。图像中的 7 被识别为 1,有时根本不被识别。我正在尝试获取图像(乐透彩票)的文本(字符串)表示,因此我在使用用户的照相手机拍摄的图像上使用 OCR。如果您有一个更简单的解决方案,那就太好了。 真的很抱歉。我无法帮助您,因为我的工作是全栈网络应用程序开发人员,而我在该领域完全没有专业知识。对不起。以上是关于如何使用 tesseract.js 识别乐透彩票上的日期和数字?的主要内容,如果未能解决你的问题,请参考以下文章