Spaces:
Running
on
A10G
Running
on
A10G
| import gradio as gr | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| import tempfile | |
| import os | |
| def extract_canny_edges(video_path, low_threshold=50, high_threshold=150): | |
| """ | |
| استخراج Canny edges از ویدیو | |
| """ | |
| cap = cv2.VideoCapture(video_path) | |
| # دریافت اطلاعات ویدیو | |
| fps = int(cap.get(cv2.CAP_PROP_FPS)) | |
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
| # ساخت فایل خروجی موقت | |
| output_path = tempfile.mktemp(suffix='.mp4') | |
| fourcc = cv2.VideoWriter_fourcc(*'mp4v') | |
| out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) | |
| frame_count = 0 | |
| canny_frames = [] | |
| while True: | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| # تبدیل به Grayscale | |
| gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
| # اعمال Gaussian Blur برای کاهش نویز | |
| blurred = cv2.GaussianBlur(gray, (5, 5), 0) | |
| # استخراج Canny edges | |
| edges = cv2.Canny(blurred, low_threshold, high_threshold) | |
| # تبدیل به BGR برای ذخیره | |
| edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) | |
| # نوشتن فریم در ویدیوی خروجی | |
| out.write(edges_bgr) | |
| # ذخیره برای پیشنمایش | |
| if frame_count % 5 == 0: # هر 5 فریم یکی | |
| edges_rgb = cv2.cvtColor(edges, cv2.COLOR_GRAY2RGB) | |
| canny_frames.append(Image.fromarray(edges_rgb)) | |
| frame_count += 1 | |
| cap.release() | |
| out.release() | |
| return output_path, canny_frames, frame_count, fps | |
| def process_video(video_path, low_threshold, high_threshold): | |
| """ | |
| پردازش ویدیو و استخراج حرکات | |
| """ | |
| if video_path is None: | |
| return None, None, "❌ لطفاً یک ویدیو آپلود کنید" | |
| try: | |
| output_video, preview_frames, total_frames, fps = extract_canny_edges( | |
| video_path, | |
| int(low_threshold), | |
| int(high_threshold) | |
| ) | |
| status = f""" | |
| ✅ استخراج حرکات با موفقیت انجام شد! | |
| 📊 اطلاعات: | |
| • تعداد کل فریمها: {total_frames} | |
| • FPS: {fps} | |
| • مدت زمان: {total_frames/fps:.2f} ثانیه | |
| """ | |
| return output_video, preview_frames, status | |
| except Exception as e: | |
| return None, None, f"❌ خطا: {str(e)}" | |
| # رابط Gradio | |
| with gr.Blocks(title="Wan2.1 Canny Edge Extractor", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # 🎬 استخراج حرکات ویدیو (Canny Edge Detection) | |
| این ابزار با استفاده از الگوریتم **Canny Edge Detection**، لبهها و حرکات ویدیو شما را استخراج میکند. | |
| این خروجی میتواند به عنوان ورودی برای مدل **Wan2.1 ControlNet** استفاده شود. | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_video = gr.Video( | |
| label="📹 ویدیوی ورودی", | |
| height=400 | |
| ) | |
| gr.Markdown("### ⚙️ تنظیمات Canny") | |
| low_threshold = gr.Slider( | |
| minimum=0, | |
| maximum=255, | |
| value=50, | |
| step=1, | |
| label="آستانه پایین (Low Threshold)", | |
| info="مقدار کمتر = لبههای بیشتر" | |
| ) | |
| high_threshold = gr.Slider( | |
| minimum=0, | |
| maximum=255, | |
| value=150, | |
| step=1, | |
| label="آستانه بالا (High Threshold)", | |
| info="مقدار بیشتر = فقط لبههای قوی" | |
| ) | |
| process_btn = gr.Button( | |
| "🚀 استخراج حرکات", | |
| variant="primary", | |
| size="lg" | |
| ) | |
| with gr.Column(): | |
| status_text = gr.Textbox( | |
| label="وضعیت", | |
| lines=6, | |
| interactive=False | |
| ) | |
| output_video = gr.Video( | |
| label="🎥 ویدیوی Canny Edges", | |
| height=400 | |
| ) | |
| preview_gallery = gr.Gallery( | |
| label="🖼️ پیشنمایش فریمها", | |
| columns=4, | |
| height=300 | |
| ) | |
| gr.Markdown(""" | |
| --- | |
| ### 📖 راهنمای استفاده: | |
| 1. **آپلود ویدیو**: یک ویدیو آپلود کنید (توصیه: کمتر از 30 ثانیه) | |
| 2. **تنظیم آستانهها**: | |
| - آستانه پایین: کنترل حساسیت تشخیص لبه | |
| - آستانه بالا: فیلتر کردن لبههای ضعیف | |
| 3. **استخراج**: روی دکمه "استخراج حرکات" کلیک کنید | |
| 4. **دانلود**: ویدیوی خروجی را دانلود کنید | |
| ### 💡 نکات: | |
| - **آستانه کم** (مثلاً 30-100): جزئیات بیشتر، نویز بیشتر | |
| - **آستانه متوسط** (مثلاً 50-150): پیشنهادی - تعادل خوب | |
| - **آستانه بالا** (مثلاً 100-200): فقط لبههای اصلی | |
| ### 🔗 استفاده در Wan2.1: | |
| ویدیوی خروجی میتواند به عنوان **ControlNet conditioning** برای مدل Wan2.1 استفاده شود. | |
| --- | |
| 🔗 مدل: [TheDenk/wan2.1-t2v-1.3b-controlnet-canny-v1](https://huggingface.co/TheDenk/wan2.1-t2v-1.3b-controlnet-canny-v1) | |
| """) | |
| # اتصال دکمه به تابع | |
| process_btn.click( | |
| fn=process_video, | |
| inputs=[input_video, low_threshold, high_threshold], | |
| outputs=[output_video, preview_gallery, status_text] | |
| ) | |
| # اجرای اپلیکیشن | |
| if __name__ == "__main__": | |
| demo.launch(share=True) |