Spaces:
Runtime error
Runtime error
import gradio as gr | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import google.generativeai as genai | |
from sympy import sympify, solve | |
import os | |
from dotenv import load_dotenv | |
# Load environment variables | |
load_dotenv() | |
# Initialize Google Generative AI | |
def initialize_genai(): | |
api_key = os.getenv("GOOGLE_API_KEY") | |
if not api_key: | |
raise ValueError("Google API Key not found in environment variables.") | |
genai.configure(api_key=api_key) | |
def create_prompt(image): | |
# Adjust the prompt based on how the model expects the input | |
return "Analyze the following image of an equation. Recognize and solve the equation. Image:" | |
def recognize_equation_with_genai(image): | |
try: | |
# Convert image to text using Google Generative AI with a prompt template | |
prompt = create_prompt(image) | |
response = genai.text_detect(image, prompt=prompt) | |
recognized_text = response.get('text', '') | |
return recognized_text.strip() | |
except Exception as e: | |
return f"Error recognizing text: {str(e)}" | |
def solve_equation(equation): | |
try: | |
expr = sympify(equation) | |
solutions = solve(expr) | |
return str(solutions) | |
except Exception as e: | |
return f"Error solving equation: {str(e)}" | |
def process_frame(frame): | |
# Convert frame to grayscale | |
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
_, thresholded = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) | |
# Convert OpenCV image to PIL image | |
image = Image.fromarray(thresholded) | |
# Recognize and solve the equation | |
recognized_equation = recognize_equation_with_genai(image) | |
solutions = solve_equation(recognized_equation) | |
return recognized_equation, solutions, image | |
def main(): | |
# Initialize Google Generative AI | |
initialize_genai() | |
with gr.Blocks() as demo: | |
gr.Markdown("## Virtual Math Calculator with Google Generative AI") | |
with gr.Row(): | |
video_input = gr.Video(source="webcam", type="numpy", label="Record your video") | |
output_text = gr.Textbox(label="Recognized Equation") | |
output_solutions = gr.Textbox(label="Solution") | |
output_image = gr.Image(label="Captured Image") | |
def process_video(video): | |
frame = video[0] # Take the first frame from the video | |
recognized_equation, solutions, image = process_frame(frame) | |
return recognized_equation, solutions, image | |
video_input.change(process_video, inputs=video_input, outputs=[output_text, output_solutions, output_image]) | |
demo.launch() | |
if __name__ == "__main__": | |
main() |