import gradio as gr import cv2 import numpy as np # Load Haar Cascade for face detection face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') def process_image(image, operation, canny_threshold1=100, canny_threshold2=200, blur_kernel=5): # Convert Gradio image (PIL) to OpenCV format (BGR) image = np.array(image) image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # Initialize output dictionary outputs = {} # Perform selected operation if operation == "Grayscale": gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) outputs["Grayscale Image"] = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB) elif operation == "Canny Edge Detection": gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, canny_threshold1, canny_threshold2) outputs["Edges"] = cv2.cvtColor(edges, cv2.COLOR_GRAY2RGB) elif operation == "Gaussian Blur": if blur_kernel % 2 == 0: blur_kernel += 1 # Kernel size must be odd blurred = cv2.GaussianBlur(image, (blur_kernel, blur_kernel), 0) outputs["Blurred Image"] = blurred elif operation == "Face Detection": gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) output_image = image.copy() for (x, y, w, h) in faces: cv2.rectangle(output_image, (x, y), (x+w, y+h), (0, 255, 0), 2) outputs["Faces Detected"] = output_image # Convert back to RGB for Gradio display for key in outputs: outputs[key] = cv2.cvtColor(outputs[key], cv2.COLOR_BGR2RGB) return outputs # Define Gradio interface with gr.Blocks() as demo: gr.Markdown("# OpenCV Feature Demo") gr.Markdown("Upload an image and select an OpenCV operation to apply.") with gr.Row(): with gr.Column(): image_input = gr.Image(label="Upload Image", type="pil") operation = gr.Dropdown( choices=["Grayscale", "Canny Edge Detection", "Gaussian Blur", "Face Detection"], label="Select Operation", value="Grayscale" ) canny_threshold1 = gr.Slider(0, 500, value=100, step=10, label="Canny Threshold 1", visible=False) canny_threshold2 = gr.Slider(0, 500, value=200, step=10, label="Canny Threshold 2", visible=False) blur_kernel = gr.Slider(3, 21, value=5, step=2, label="Blur Kernel Size", visible=False) # Show/hide sliders based on operation def update_sliders(op): if op == "Canny Edge Detection": return gr.update(visible=True), gr.update(visible=True), gr.update(visible=False) elif op == "Gaussian Blur": return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) else: return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False) operation.change(update_sliders, inputs=operation, outputs=[canny_threshold1, canny_threshold2, blur_kernel]) with gr.Column(): output = gr.Gallery(label="Processed Image") submit_button = gr.Button("Process Image") submit_button.click( fn=process_image, inputs=[image_input, operation, canny_threshold1, canny_threshold2, blur_kernel], outputs=output ) if __name__ == "__main__": demo.launch()