EMBA měření odstínu barvy LS2

Všechny aplikace jsou navrženy v Pythonu, zdrojový kód a programy tak můžete snadno upravovat na klientských PC např. v poznámkovém bloku jako txt soubor a uložením s příponou PY (program.py). V PC stačí nainstalovat Python a knihovny dle aplikace.

Sledování odstínu barvy lepenky u LS2:

  • Automatické generování grafu a snímání textu a čísel.
  • Doplněno o kontrolní zápis hodnot do textového souboru včetně časového razítka.
  • Přidána podmínka minimální a maximální hodnoty (seknutí, údržba snímače, …), tyto hodnoty se nezapíšou.
  • Vylepšené snímání textu, přidáno náhledové okno zobrazující snímanou část obrazovky (souřadnice v programu).
  • Vyžaduje nainstalovaný Tesseract OCR na PC, kde aplikace běží (postup instalace a nastavení níže).
  • Další případné funkce doplním.
				
					import cv2
import numpy as np
import pytesseract
from PIL import ImageGrab
import time
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.dates as mdates
import datetime
from collections import deque
import os

# Přidána podmínka pro min. a max. hodnoty, které se zapíší do grafu
# Přidán zelený vykreslovací obdélník
# Doplněno o kontrolní zápis hodnot do textového souboru včetně časového razítka
# Přidáno automatické vygenerování grafu v png každých 120 minut (včetně pravého pro kontrolu souřadnice čtení)
# Přidán datum do časového razítka a čas posledního záznamu (červeně)

def get_number_from_screen(x, y, w, h):
    screenshot = ImageGrab.grab(bbox=(x, y, x + w, y + h))
    screenshot_cv2 = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    gray = cv2.cvtColor(screenshot_cv2, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

    # Zvětšení části obrázku obsahující číslo
    roi = screenshot_cv2[y:y+h, x:x+w]
    resized_roi = cv2.resize(roi, (300, 300), interpolation=cv2.INTER_CUBIC)

    # Převod na odstíny šedi a binarizace
    gray = cv2.cvtColor(resized_roi, cv2.COLOR_BGR2GRAY)
    _, thresh_roi = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

    custom_config = r'--oem 3 --psm 6 outputbase digits'
    text = pytesseract.image_to_string(thresh_roi, config=custom_config)
    text = text.replace(",", ".")

    try:
        number = float(text)
    except ValueError:
        number = None

    # Přidání obdélníku kolem dané oblasti
    cv2.rectangle(resized_roi, (0, 0), (300, 300), (0, 255, 0), 2)

    # Změna obrázku z BGR na RGB a vrácení obrázku
    rgb_image = cv2.cvtColor(resized_roi, cv2.COLOR_BGR2RGB)
    return number, rgb_image

# Funkce pro zápis hodnot s časovým razítkem to textového souboru
def write_to_file(data):
    with open('odstinls2.txt', 'a') as f:
        f.write(f'{datetime.datetime.now()}: {data}\n')

def save_graph(fig):
    now = datetime.datetime.now()
    filename = f"graph_{now.strftime('%Y-%m-%d_%H-%M-%S')}.png"
    fig.savefig(filename)
    print(f"Graf byl uložen do souboru {filename}")

def update_graph(timestamps, readings, fig, ax1, ax2):
    ax1.clear()
    ax1.plot(timestamps, readings)
    ax1.set_xlabel("Datum a čas")
    ax1.set_ylabel("Hodnota")
    ax1.set_title("Hodnoty za posledních 24 hodin")
    ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))  # formát datum a čas
    ax1.xaxis.set_major_locator(mdates.MinuteLocator(interval=60))
    ax1.set_ylim(90, 100)
    ax1.grid(True)  # Zobrazí mřížku v grafu
    fig.autofmt_xdate()

    # Čas a datum posledního datového bodu
    last_timestamp = timestamps[-1] if timestamps else None

    # Přidání časového razítka jako textu do grafu
    if last_timestamp is not None:
        ax1.text(last_timestamp, readings[-1], last_timestamp.strftime('%Y-%m-%d %H:%M'), color='red', fontsize=9)

    _, screenshot = get_number_from_screen(x, y, w, h)
    ax2.imshow(screenshot)
    ax2.axis('off')

    canvas.draw()
    if readings:
        write_to_file(readings[-1])

def main():
    global x, y, w, h, fig, ax1, ax2, canvas
    x, y, w, h = 400, 480, 480, 550
    interval = 10
    max_time = datetime.timedelta(minutes=1440)
    readings = deque()
    timestamps = deque()

    root = tk.Tk()
    root.title("EMBA sledování odstínu barvy LS2")

    fig = Figure(figsize=(8, 4), dpi=100)
    ax1, ax2 = fig.subplots(1, 2)

    canvas = FigureCanvasTkAgg(fig, root)
    canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

    def update_loop():
        now = datetime.datetime.now()
        number, _ = get_number_from_screen(x, y, w, h)
        if number is not None:
            if 90 <= number <= 98:  # přidání podmínky pro minimální a maximální hodnoty
                print(number)
                timestamps.append(now)
                readings.append(number)

            # Odstranění hodnot starších než 1440 minut
            while timestamps and (now - timestamps[0]) > max_time:
                timestamps.popleft()
                readings.popleft()

            update_graph(timestamps, readings, fig, ax1, ax2)

        root.after(int(interval * 1000), update_loop)

        if now.minute % 1440 == 0 and now.second == 0:  # nastavení časového úseku v min., za který se vygeneruje graf v png
            filename = now.strftime("%Y-%m-%d_%H-%M-%S") + ".png"
            fig.savefig(filename)

    update_loop()
    root.mainloop()

if __name__ == "__main__":
    main()
				
			

Ukázka spuštěného programu:

Postup instalace Tesseract OCR

Nejprve si nainstalujte Tesseract OCR. Pokud používáte Windows, můžete si jej stáhnout zde: https://github.com/UB-Mannheim/tesseract/wiki. Během instalace si všimněte cesty, kam byl Tesseract nainstalován. Výchozí cesta je obvykle C:\Program Files\Tesseract-OCR. Přidejte cestu k binárnímu souboru Tesseract do proměnné prostředí PATH.

a. Na ploše klikněte pravým tlačítkem myši na ikonu “Tento počítač” nebo “Můj počítač” a zvolte “Vlastnosti”.

b. Klikněte na “Rozšířené nastavení systému”.

c. Klikněte na tlačítko “Proměnné prostředí”.

d. V sekci “Systémové proměnné” vyhledejte proměnnou Path a klikněte na tlačítko “Upravit”.

e. Klikněte na tlačítko “Nový” a přidejte cestu k binárnímu souboru Tesseract, např. C:\Program Files\Tesseract-OCR.

f. Klikněte na “OK” a pak znovu na “OK” ve všech otevřených oknech.

Restartujte PyCharm nebo jiné běhové prostředí, aby se změny projevily.

Nyní by měl váš kód fungovat bez problémů, protože Tesseract by měl být správně nainstalován a v cestě systému.

0:00
0:00