如何使用 tesseract.js 识别乐透彩票上的日期和号码?
How to use tesseract.js to recognize a date and numbers on a lotto ticket?
我的应用程序尝试识别开奖日期和彩票中的号码。但是,由于机票背景上的图像,我无法检测到日期和号码。我如何修改我的代码才能实现我的目标?
最初我试图找到一个 API 可以接受彩票条形码和 return 是否是中奖彩票。在对网络进行广泛研究后,我开始意识到这种方法是不可能的,所以现在我正在尝试使用字符识别方法来检测数字和开奖日期。有了这些信息,我就会将它与中奖号码和开奖日期进行交叉引用。
这里的好处是所需的字符是黑色的,而其他所有字符都有不同的颜色。
我尝试使用 this 逻辑,但我很难操纵代码来满足我的目的。
所需的代码将输出 "First Draw:" 日期和播放的 6 个号码(在 A06: 的右侧)。
我实际得到的是:
“没有”
0
“Wm“{
3153:» -.: , .4,
LDTTU PLUS,.;: 7N9"???
女士:10 20 24 25 32 3.7
总计:R5 ‘00。 7‘
慧聪? ‘E:
IWHW 753:“
15/0/19 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 and A06: 10 20 24 25 32 37
太棒了...我试了一下。
我先将图像转换为灰度图像,然后检查该值是高于还是低于阈值。只需上传图像并移动滑块即可更改阈值。
(而且你可能需要整页打开它 lol)
玩得开心 :)
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>
我的应用程序尝试识别开奖日期和彩票中的号码。但是,由于机票背景上的图像,我无法检测到日期和号码。我如何修改我的代码才能实现我的目标?
最初我试图找到一个 API 可以接受彩票条形码和 return 是否是中奖彩票。在对网络进行广泛研究后,我开始意识到这种方法是不可能的,所以现在我正在尝试使用字符识别方法来检测数字和开奖日期。有了这些信息,我就会将它与中奖号码和开奖日期进行交叉引用。 这里的好处是所需的字符是黑色的,而其他所有字符都有不同的颜色。 我尝试使用 this 逻辑,但我很难操纵代码来满足我的目的。
所需的代码将输出 "First Draw:" 日期和播放的 6 个号码(在 A06: 的右侧)。
我实际得到的是:
“没有” 0 “Wm“{ 3153:» -.: , .4, LDTTU PLUS,.;: 7N9"??? 女士:10 20 24 25 32 3.7 总计:R5 ‘00。 7‘ 慧聪? ‘E: IWHW 753:“ 15/0/19 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 and A06: 10 20 24 25 32 37
太棒了...我试了一下。
我先将图像转换为灰度图像,然后检查该值是高于还是低于阈值。只需上传图像并移动滑块即可更改阈值。
(而且你可能需要整页打开它 lol)
玩得开心 :)
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>