Как решить задачу с помощью фоторешателя уравненийPython

Программы на Python
Ответить
Anonymous
 Как решить задачу с помощью фоторешателя уравнений

Сообщение Anonymous »

Я хочу сделать программу, которая будет распознавать программу по фотографии и решать ее. Код представлен ниже. Но программа вылетает на этапе загрузки фото. Пожалуйста, помогите мне решить эту задачу!
Я добавил в программу pytesseract и указал для него конфигурацию, чтобы было легче распознавать уравнения
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()


Подробнее здесь: https://stackoverflow.com/questions/793 ... ion-solver
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»