Wie man ein Problem mit einem Fotogleichungslöser löstPython

Python-Programme
Guest
 Wie man ein Problem mit einem Fotogleichungslöser löst

Post by Guest »

Ich möchte ein Programm erstellen, das ein Programm anhand eines Fotos erkennt und das Problem löst. Der Code wird unten dargestellt. Aber das Programm stürzt beim Laden des Fotos ab. Bitte helfen Sie mir, dieses Problem zu lösen!
Ich habe Pytesseract zum Programm hinzugefügt und die Konfiguration dafür angegeben, um das Erkennen der Gleichungen zu erleichtern

Code: Select all

import customtkinter as ctk
from tkinter import filedialog, messagebox
import cv2
import pytesseract
from PIL import Image
from sympy import sympify, Eq, solve
import re

# Указываем путь к Tesseract (если Windows)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Основное окно приложения
app = ctk.CTk()
app.title("Распознавание сложных уравнений")
app.geometry("700x600")

# Переменные для хранения уравнения и изображения
recognized_equation = ctk.StringVar(value="")
solution_result = ""
ctk_image = None  # Переменная для хранения изображения (глобально)

def preprocess_image(image_path):
"""Обработка изображения: улучшение контраста и бинаризация"""
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
processed_image = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
return processed_image

def extract_equation(image_path):
"""Распознавание уравнения с помощью Tesseract"""
image = preprocess_image(image_path)
custom_config = r"--psm 6 --oem 3"
equation_text = pytesseract.image_to_string(image, config=custom_config)
equation_text = equation_text.replace('^', '**')  # Исправление ошибок распознавания
equation_text = re.sub(r"[^\d\+\-\*\/\^\(\)=x]", "", equation_text)
return equation_text.strip()

def solve_equation(equation_text):
"""Попытка решения уравнения с помощью sympy"""
global solution_result
try:
# Исправление символов для корректного синтаксиса Python
equation_text = equation_text.replace("^", "**")
left, right = equation_text.split("=")
equation = Eq(sympify(left), sympify(right))
solution = solve(equation)
solution_result = f"Решение: {solution}"
return solution
except Exception as e:
solution_result = f"Ошибка при решении: {e}"
return solution_result

def save_results_to_file(equation, solution):
"""Сохранение уравнения и решения в текстовый файл"""
file_path = filedialog.asksaveasfilename(defaultextension=".txt",
filetypes=[("Text files", "*.txt")])
if file_path:
with open(file_path, "w", encoding="utf-8") as file:
file.write(f"Распознанное уравнение: {equation}\n")
file.write(f"{solution}\n")
messagebox.showinfo("Сохранение", "Результаты сохранены успешно!")

def upload_image():
"""Открытие диалогового окна для загрузки изображения"""
global ctk_image  # Глобальная переменная для хранения изображения
file_path = filedialog.askopenfilename(filetypes=[("Изображения", "*.png;*.jpg;*.jpeg;*.bmp")])
if file_path:
try:
# Обновленное создание изображения через CTkImage
image = Image.open(file_path)
ctk_image = ctk.CTkImage(light_image=image, size=(250, 250))
img_label.configure(image=ctk_image)
img_label.image = ctk_image  # ВАЖНО: сохранение ссылки на изображение

# Распознавание уравнения
equation = extract_equation(file_path)
recognized_equation.set(f"Распознанное уравнение: {equation}")

# Решение уравнения
solution = solve_equation(equation)
messagebox.showinfo("Решение уравнения", f"{solution_result}")

except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось загрузить изображение:  {e}")

# Элементы интерфейса
title_label = ctk.CTkLabel(app, text="Распознавание сложных уравнений", font=("Arial", 24))
title_label.pack(pady=15)

upload_button = ctk.CTkButton(app, text="Загрузить изображение", command=upload_image)
upload_button.pack(pady=10)

save_button = ctk.CTkButton(app, text="Сохранить результат",
command=lambda: save_results_to_file(recognized_equation.get(), solution_result))
save_button.pack(pady=10)

img_label = ctk.CTkLabel(app, text="Предпросмотр изображения", width=250, height=250)
img_label.pack(pady=10)

result_label = ctk.CTkLabel(app, textvariable=recognized_equation, font=("Arial", 18), wraplength=600)
result_label.pack(pady=20)

# Запуск основного цикла приложения
app.mainloop()

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post