Оцифровка показників приладів на Python та Tesseract
Останнім часом я перейшов на автоматизовану перевірку модулів та проектних схем. Для цього використовую обладнання, яке під'єднується до комп'ютера, і таким чином автоматично знімаються покази. Але не все обладнання може передавати цифрові дані.
Наприклад, інфрачервоний тепловізор дає лише зображення, і немає можливості отримати температуру у вигляді числових даних. Це лише USB-камера. Під час тестування зображення записуються, і в результаті автоматизованого тестування я отримую багато записів такого виду:
id,time,prog_current,bat_current,load_voltage,load_current,bat_voltage,ir_image
0,2024-08-30T19:30:01.260730,100.0,145.000,5.053,103.0,4.03,./img/test_2311_discharge_temp__1725035401.557107.png
1,2024-08-30T19:30:02.116880,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035402.762693.png
2,2024-08-30T19:30:03.344875,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035403.615202.png
3,2024-08-30T19:30:04.152445,100.0,145.000,5.054,104.0,4.03,./img/test_2311_discharge_temp__1725035404.52685.png
4,2024-08-30T19:30:05.072659,100.0,146.000,5.053,102.0,4.03,./img/test_2311_discharge_temp__1725035405.466401.png
5,2024-08-30T19:30:06.064686,100.0,145.000,5.054,99.0,4.03,./img/test_2311_discharge_temp__1725035406.369785.png
6,2024-08-30T19:30:06.945230,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035407.294545.png
Звідси й виникає задача — для аналізу мені потрібно отримати температуру у вигляді числового значення. Щоб не робити це вручну, потрібна якась програма, яка автоматично розпізнає кілька тисяч зображень.
Варіанти вирішення
Звісно, перше, що приходить на думку — це щось на кшталт "давайте завантажимо всі ці файли в ChatGPT/Gemini (оберіть улюблену опцію) і нехай AI виконає цю роботу". Але цей метод у мене не спрацював. ChatGPT не хоче обробляти більше кількох файлів одночасно.
Наступна думка — добре, тоді використаємо нейронну мережу, яку можна запустити локально, щоб обійти всі обмеження. Це дійсно може спрацювати, але часу на це піде дуже багато.
І ось тут ChatGPT нагадав мені, що колись давно існувала досить проста й невибаглива бібліотека для розпізнавання текстів, а особливо чисел — Tesseract. Саме цю бібліотеку я і спробую використати для вирішення задачі.
Налаштування середовища
Встановимо необхідні пакети для Python:
pip install pytesseract
pip install opencv-python
Встановлюємо Tesseract OCR
- для Windows - завантажити неофіційні збірки можна за цим посиланням: https://github.com/UB-Mannheim/tesseract/wiki.
Я встановив його в папку: C:\Program Files\Tesseract-OCR. - для Linux Tesseract зазвичай доступний у стандартних пакетах. Нічого завантажувати не потрібно — досить встановити його через пакетний менеджер.
Реалзіація
Зображення з тепловізора я отримаю ось такого виду:
Далі реалзіація на Python для роспізнавання та запису результатів в CSV файл.
import pandas as pd
import pytesseract
import cv2
import platform
import re
def crop_top_left_number(image_path, left=24, upper=10, right=80, lower=36):
image = cv2.imread(image_path)
## Обрізаємо лише потрібну для роспізнавання частину зображення
cropped_image = image[upper:lower, left:right]
gray_image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2GRAY)
_, thresh_image = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY_INV)
## Роспізнаємо текст на зображені
text = pytesseract.image_to_string(thresh_image, config='--psm 6')
## Прибираємо зайвий текст, залишаємо лише цифри
match = re.search(r'(\d+\.\d+).*', text)
if match:
return match.group(1)
return "error"
## Для OS Windows потрібно вказати шлях до Tesseract OCR
if platform.system() == "Windows":
pytesseract.pytesseract.tesseract_cmd =
'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
## Читаємо вхідний CSV файл
output_data = pd.read_csv("input.csv")
for i in range(len(output_data)):
image_file = output_data.loc[i, 'ir_image']
temperature = crop_top_left_number(image_file)
image_to_temp_map[image_file] = temperature
output_data.at[i, 'ir_image'] = temperature
## Записуємо все в вихідний CSV файл
output_data.to_csv("output.csv", index=False)
І вже за декілька хвилин я маю в результуючому файлі оцифровані значення.
id,time,prog_current,bat_current,load_voltage,load_current,bat_voltage,ir_image
0,2024-08-30T19:30:01.260730,100.0,145.0,5.053,103.0,4.03,30.1
1,2024-08-30T19:30:02.116880,100.0,145.0,5.055,98.0,4.03,30.1
2,2024-08-30T19:30:03.344875,100.0,145.0,5.055,98.0,4.03,30.1
3,2024-08-30T19:30:04.152445,100.0,145.0,5.054,104.0,4.03,30.1
4,2024-08-30T19:30:05.072659,100.0,146.0,5.053,102.0,4.03,30.1
5,2024-08-30T19:30:06.064686,100.0,145.0,5.054,99.0,4.03,30.1
6,2024-08-30T19:30:06.945230,100.0,145.0,5.055,98.0,4.03,30.1
...



Коментарі
Дописати коментар