OpenCV : معالجة الصور والفيديوهات بالذكاء الاصطناعي

مقدمة عن مكتبة OpenCV في بايثون

في عالم التكنولوجيا الحديثة، تلعب الرؤية الحاسوبية (Computer Vision) دورًا أساسيًا في العديد من التطبيقات، بدءًا من معالجة الصور والفيديو، وصولًا إلى الذكاء الاصطناعي وتعلم الآلة. وهنا تأتي مكتبة OpenCV (Open Source Computer Vision Library) كواحدة من أقوى الأدوات المتاحة لمطوري البرمجيات والمختصين في هذا المجال.

ما هي OpenCV؟

OpenCV هي مكتبة مفتوحة المصدر متخصصة في معالجة الصور والفيديو، وقد تم تطويرها في الأصل بواسطة Intel عام 1999، ثم أصبحت مفتوحة المصدر ليتمكن الجميع من استخدامها وتطويرها. تدعم OpenCV العديد من لغات البرمجة مثل C++, Python، وJava، ولكن بايثون تُعد واحدة من أكثر اللغات استخدامًا معها نظرًا لسهولة التعامل مع المكتبة وسرعتها في التطوير.

لماذا نستخدم OpenCV؟

توفر OpenCV مجموعة ضخمة من الأدوات والوظائف لمعالجة وتحليل الصور والفيديو، مما يجعلها مثالية في مجالات متعددة، مثل:
التعرف على الأوجه في الصور والفيديوهات.
اكتشاف الأجسام والحركة في الوقت الحقيقي.
تحليل الصور الطبية في التطبيقات الصحية.
تحسين جودة الصور عبر تطبيق الفلاتر وتقنيات التنعيم.
استخدام الذكاء الاصطناعي في تحليل المشاهد والتعرف على الأنماط.

مجالات استخدام OpenCV

  • الأمن والمراقبة: تحليل الفيديوهات من الكاميرات الأمنية والتعرف على الأشخاص المشبوهين.
  • الروبوتات والذكاء الاصطناعي: مساعدة الروبوتات في فهم العالم من حولها عبر تحليل الصور.
  • الطب والتشخيص الطبي: تحليل صور الأشعة السينية والمساعدة في تشخيص الأمراض.
  • الألعاب والواقع المعزز: تتبع الحركة والتفاعل مع البيئة في الوقت الحقيقي.

باختصار، OpenCV ليست مجرد مكتبة عادية، بل أداة قوية تجعل معالجة الصور والرؤية الحاسوبية أسهل وأكثر كفاءة، مما يجعلها الخيار الأول للمطورين في هذا المجال.

في الأقسام القادمة، سنتعرف على كيفية تثبيت OpenCV، وطرق التعامل مع الصور والفيديوهات، وتقنيات متقدمة مثل التعرف على الوجوه وتتبع الأجسام.

كيفية تثبيت OpenCV في بايثون

للبدء باستخدام مكتبة OpenCV في لغة بايثون، يجب تثبيتها أولًا. توفر OpenCV إصدارين رئيسيين:

  1. opencv-python: الإصدار الأساسي الذي يحتوي على الوظائف الأساسية لمعالجة الصور والفيديو.
  2. opencv-contrib-python: إصدار متقدم يحتوي على ميزات إضافية مثل SIFT, SURF، وExtra Modules.

1. تثبيت OpenCV باستخدام pip

أسهل طريقة لتثبيت OpenCV هي باستخدام مدير الحزم pip. يمكن تنفيذ الأمر التالي في بيئة بايثون الافتراضية أو مباشرة في سطر الأوامر:

pip install opencv-python

2. تثبيت الإصدار الكامل (opencv-contrib-python)

إذا كنت بحاجة إلى الميزات الإضافية المتقدمة، مثل اكتشاف الميزات المتقدمة وتحليل الفيديوهات المتطور، فيجب تثبيت الإصدار الموسع باستخدام الأمر التالي:

pip install opencv-contrib-python

ملاحظة: لا تقم بتثبيت opencv-python وopencv-contrib-python معًا، لأن كل منهما يحتوي على نفس الحزمة الأساسية، وقد يؤدي ذلك إلى تعارض في الإصدارات.

3. التحقق من نجاح التثبيت

بعد التثبيت، يمكنك التحقق مما إذا كان OpenCV قد تم تثبيته بنجاح عن طريق تشغيل الأوامر التالية في بايثون:

import cv2
print(cv2.__version__)

إذا تمت الطباعة بنجاح مع ظهور رقم الإصدار، فهذا يعني أن المكتبة مثبتة وتعمل بدون مشاكل.

مشكلة في التثبيت؟ إليك بعض الحلول!

تأكد من أن لديك أحدث إصدار من pip:

pip install --upgrade pip

جرّب التثبيت باستخدام بيئة افتراضية (venv أو conda) لتجنب التعارضات.
في حال كنت تستخدم Windows، تأكد من تثبيت Microsoft C++ Build Tools لتجنب أخطاء التجميع.

الآن بعد أن تم تثبيت OpenCV بنجاح، يمكنك البدء في استكشاف وظائف المكتبة والعمل مع الصور والفيديوهات!

قراءة وعرض الصور والفيديوهات باستخدام OpenCV في بايثون

بعد تثبيت OpenCV، يمكننا البدء في التعامل مع الصور والفيديوهات بسهولة. توفر المكتبة وظائف قوية لتحميل الملفات، معالجتها، وعرضها.

1. تحميل الصور باستخدام cv2.imread()

تُستخدم دالة cv2.imread() لقراءة صورة من ملف معين وتحميلها في الذاكرة كـ مصفوفة NumPy.

الصيغة العامة:

cv2.imread(filename, flags)
  • filename: مسار الصورة.
  • flags: طريقة قراءة الصورة، وتشمل:
    • cv2.IMREAD_COLOR (القيمة الافتراضية) → تحميل الصورة بالألوان (بدون قناة ألفا).
    • cv2.IMREAD_GRAYSCALE → تحميل الصورة بتدرجات الرمادي.
    • cv2.IMREAD_UNCHANGED → تحميل الصورة مع جميع قنواتها (بما في ذلك قناة الشفافية Alpha).

مثال على قراءة صورة وعرض أبعادها:

import cv2

# تحميل الصورة بالألوان
image = cv2.imread("image.jpg", cv2.IMREAD_COLOR)

# طباعة أبعاد الصورة
print(f"Dimensions: {image.shape}")

2. عرض الصور باستخدام cv2.imshow()

لعرض الصورة، نستخدم cv2.imshow()، التي تفتح نافذة تعرض الصورة.

الصيغة العامة:

cv2.imshow(window_name, image)
  • window_name: اسم النافذة (يمكن أن يكون أي نص).
  • image: الصورة التي تم تحميلها باستخدام cv2.imread().

مثال على قراءة صورة وعرضها:

import cv2

# تحميل الصورة
image = cv2.imread("image.jpg", cv2.IMREAD_COLOR)

# عرض الصورة في نافذة
cv2.imshow("Displayed Image", image)

# الانتظار حتى يضغط المستخدم على أي مفتاح
cv2.waitKey(0)

# إغلاق جميع النوافذ المفتوحة
cv2.destroyAllWindows()

ملاحظات:

  • cv2.waitKey(0): تنتظر حتى يضغط المستخدم على أي مفتاح لإغلاق النافذة.
  • cv2.destroyAllWindows(): تغلق جميع النوافذ المفتوحة لمنع الأخطاء.

3. التعامل مع الفيديوهات والكاميرا باستخدام cv2.VideoCapture()

تتيح OpenCV تحميل الفيديوهات وتشغيلها بالإضافة إلى الوصول إلى الكاميرا.

قراءة الفيديو من ملف:

import cv2

# تحميل الفيديو
cap = cv2.VideoCapture("video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow("Video Playback", frame)
    
    # الضغط على "q" للخروج
    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()
  • cv2.VideoCapture("video.mp4") → تحميل الفيديو من ملف.
  • cap.read() → قراءة كل إطار Frame على حدة.
  • cv2.waitKey(25) → تحديد سرعة التشغيل (25 مللي ثانية لكل إطار).

تشغيل الكاميرا في الوقت الحقيقي:

import cv2

# تشغيل الكاميرا (0 = الكاميرا الافتراضية)
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow("Live Camera", frame)

    # الضغط على "q" للخروج
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()
  • cv2.VideoCapture(0) → الوصول إلى الكاميرا الافتراضية.
  • cv2.waitKey(1) → تحديث الإطارات بسرعة عالية للعرض في الوقت الحقيقي.

التعامل مع الصور وتحويلها باستخدام OpenCV في بايثون

بعد تعلم كيفية تحميل وعرض الصور والفيديوهات، يمكننا الآن استكشاف بعض التعديلات الأساسية التي يمكن إجراؤها على الصور باستخدام OpenCV، مثل تغيير الحجم، تحويل الألوان، تطبيق الفلاتر، واكتشاف الحواف.

تغيير حجم الصورة باستخدام cv2.resize()

يمكن تغيير حجم الصورة لتكبيرها أو تصغيرها باستخدام cv2.resize().

الصيغة العامة:

cv2.resize(image, (width, height), interpolation)
  • image → الصورة المُدخلة.
  • (width, height) → الأبعاد الجديدة للصورة.
  • interpolation → نوع التحجيم، مثل:
    • cv2.INTER_LINEAR (الخيار الافتراضي - مناسب للتكبير).
    • cv2.INTER_AREA (أفضل خيار للتصغير).
    • cv2.INTER_CUBIC (تحجيم عالي الجودة).

مثال على تغيير حجم الصورة:

import cv2

# تحميل الصورة
image = cv2.imread("image.jpg")

# تغيير الحجم إلى 50% من الأبعاد الأصلية
resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)

# عرض الصورة الأصلية والمعدلة
cv2.imshow("Original Image", image)
cv2.imshow("Resized Image", resized_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

ملاحظة: بدلاً من تحديد أبعاد ثابتة (width, height), يمكن استخدام fx و fy كنسب مئوية للحجم الأصلي.

تحويل الصورة إلى تدرجات الرمادي باستخدام cv2.cvtColor()

يمكن تحويل الصورة إلى الأبيض والأسود (Grayscale) لتسهيل معالجة الصور، مثل اكتشاف الحواف والتعرف على الأشكال.

الصيغة العامة:

cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

مثال على التحويل إلى تدرجات الرمادي:

import cv2

# تحميل الصورة بالألوان
image = cv2.imread("image.jpg")

# تحويل الصورة إلى تدرجات الرمادي
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# عرض الصورة الأصلية والمعدلة
cv2.imshow("Original Image", image)
cv2.imshow("Grayscale Image", gray_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

تطبيق الفلاتر الأساسية مثل الضبابية باستخدام cv2.GaussianBlur()

تستخدم الضبابية (Blur) في تقليل الضوضاء والتفاصيل الحادة داخل الصور، وهو أمر مهم في عمليات معالجة الصور، مثل التعرف على الأجسام واكتشاف الحواف.

الصيغة العامة:

cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
  • kernel_size: يجب أن يكون رقمًا فرديًا (مثل 3×3 أو 5×5).
  • sigma: يؤثر على مقدار الضبابية (إذا كان 0، يتم تحديده تلقائيًا).

مثال على تطبيق الضبابية:

import cv2

# تحميل الصورة
image = cv2.imread("image.jpg")

# تطبيق ضبابية Gaussian بفلتر 5x5
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)

# عرض الصورة الأصلية والمعدلة
cv2.imshow("Original Image", image)
cv2.imshow("Blurred Image", blurred_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

ملاحظة: زيادة kernel_size تزيد من مستوى الضبابية.

اكتشاف الحواف باستخدام cv2.Canny() (Canny Edge Detection)

اكتشاف الحواف هو تقنية تُستخدم لاستخراج حواف الكائنات داخل الصورة، مما يساعد في تحليل الصور والتعرف على الأشكال.

الصيغة العامة:

cv2.Canny(image, threshold1, threshold2)
  • threshold1 و threshold2: تحدد حساسية اكتشاف الحواف، حيث يؤدي رفع القيم إلى اكتشاف أقل.

مثال على اكتشاف الحواف:

import cv2

# تحميل الصورة وتحويلها إلى التدرج الرمادي
image = cv2.imread("image.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# تطبيق Canny Edge Detection
edges = cv2.Canny(gray_image, 100, 200)

# عرض النتائج
cv2.imshow("Original Image", image)
cv2.imshow("Edge Detection", edges)

cv2.waitKey(0)
cv2.destroyAllWindows()

نصائح:

  • تقليل threshold1 يجعل الحواف أكثر وضوحًا.
  • زيادة threshold2 تجعل الكشف أكثر صرامة، مما يقلل الحواف غير الضرورية.

معالجة الفيديوهات في OpenCV باستخدام بايثون

بعد تعلم كيفية التعامل مع الصور، سنتطرق الآن إلى معالجة الفيديوهات في OpenCV. سنوضح كيفية قراءة الفيديو إطارًا بإطار، حفظ الفيديوهات بعد معالجتها، وتطبيق تأثيرات مثل تحسين الجودة وتتبع الحركة.

قراءة الفيديو ومعالجته إطارًا بإطار

لا يمكن معالجة الفيديو دفعة واحدة، لذا يتم تجزئته إلى إطارات (Frames) باستخدام cv2.VideoCapture()، ثم تطبيق التعديلات على كل إطار.

مثال على قراءة الفيديو وعرضه:

import cv2

# تحميل الفيديو
cap = cv2.VideoCapture("video.mp4")

# التحقق من نجاح فتح الفيديو
if not cap.isOpened():
    print("خطأ: لم يتم العثور على الفيديو!")
    exit()

while cap.isOpened():
    ret, frame = cap.read()  # قراءة الإطار الحالي
    if not ret:
        break  # إنهاء الحلقة عند انتهاء الفيديو

    cv2.imshow("Video Playback", frame)  # عرض الفيديو

    # الضغط على "q" للخروج
    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

شرح الكود:

  • cap.read() → يقرأ كل إطار على حدة.
  • cv2.imshow() → يعرض الإطار الحالي.
  • cv2.waitKey(25) → يحدد سرعة تشغيل الفيديو.
  • cap.release() → يغلق الفيديو بعد انتهاء التشغيل.

حفظ الفيديوهات باستخدام cv2.VideoWriter()

بعد معالجة الفيديو، يمكننا حفظه بصيغة جديدة باستخدام cv2.VideoWriter().

الصيغة العامة:

cv2.VideoWriter(filename, fourcc, fps, (width, height))
  • filename → اسم الفيديو المحفوظ.
  • fourcc → كود الترميز (Codec)، مثل:
    • cv2.VideoWriter_fourcc(*'XVID') → لحفظ الفيديو بصيغة AVI.
    • cv2.VideoWriter_fourcc(*'mp4v') → لحفظ الفيديو بصيغة MP4.
  • fps → عدد الإطارات في الثانية.
  • (width, height) → أبعاد الفيديو.

مثال على حفظ فيديو بعد تحويله إلى الأبيض والأسود:

import cv2

# تحميل الفيديو
cap = cv2.VideoCapture("video.mp4")

# الحصول على عرض وارتفاع الفيديو الأصلي
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# إعداد VideoWriter لحفظ الفيديو الجديد
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("output.avi", fourcc, 20.0, (width, height), isColor=False)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # تحويل إلى تدرجات الرمادي
    out.write(gray_frame)  # حفظ الإطار المعدل

    cv2.imshow("Grayscale Video", gray_frame)

    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

ما الذي يحدث هنا؟

  • نقرأ الفيديو إطارًا بإطار.
  • نحوله إلى الأبيض والأسود.
  • نحفظ الإطارات المعدلة إلى ملف جديد باستخدام cv2.VideoWriter().

تطبيق تأثيرات على الفيديو (تحسين الجودة وتتبع الحركة)

تحسين جودة الفيديو عبر تقليل الضوضاء

نستخدم الضبابية Gaussian Blur لتقليل التشويش في الفيديو.

مثال على تنعيم الفيديو باستخدام cv2.GaussianBlur():

import cv2

cap = cv2.VideoCapture("video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    blurred_frame = cv2.GaussianBlur(frame, (5, 5), 0)  # تطبيق الضبابية

    cv2.imshow("Blurred Video", blurred_frame)

    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

تتبع الحركة باستخدام اكتشاف الحواف (Canny Edge Detection)

يمكن اكتشاف الأجسام المتحركة عبر استخدام Canny Edge Detection لإظهار الحواف.

مثال على تتبع الحواف في الفيديو:

import cv2

cap = cv2.VideoCapture("video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # تحويل إلى الرمادي
    edges = cv2.Canny(gray_frame, 50, 150)  # اكتشاف الحواف

    cv2.imshow("Edge Detection", edges)

    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

النتيجة: يتم عرض الحواف فقط، مما يسهل اكتشاف الأجسام المتحركة أو تحديد الأشكال في الفيديو.

التعرف على الأشكال والوجوه باستخدام OpenCV في بايثون

بعد تعلم كيفية التعامل مع الصور والفيديوهات، سننتقل الآن إلى التعرف على الأشكال الهندسية والوجوه باستخدام مكتبة OpenCV. سنتناول:
اكتشاف الأشكال الهندسية (المستطيلات، الدوائر، وغيرها).
التعرف على الوجوه باستخدام Haar Cascades وDeep Learning Models.
اكتشاف العيون والابتسامات في الصور والفيديوهات.

اكتشاف الأشكال الهندسية في الصور

يمكننا استخدام تحليل الحواف واكتشاف المضلعات لاستخراج الأشكال الهندسية من الصور.

خطوات اكتشاف الأشكال:

  1. تحويل الصورة إلى تدرجات الرمادي.
  2. تطبيق تمويه Gaussian لتقليل الضوضاء.
  3. استخدام Canny Edge Detection لاستخراج الحواف.
  4. البحث عن المضلعات وتحديد عدد أضلاعها.

مثال على التعرف على المستطيلات، المثلثات، والدوائر:

import cv2
import numpy as np

# تحميل الصورة
image = cv2.imread("shapes.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # تحويل إلى الرمادي
blurred = cv2.GaussianBlur(gray, (5, 5), 0)  # تطبيق التمويه
edges = cv2.Canny(blurred, 50, 150)  # كشف الحواف

# العثور على الأشكال عبر البحث عن الحواف
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    approx = cv2.approxPolyDP(contour, 0.02 * cv2.arcLength(contour, True), True)
    cv2.drawContours(image, [approx], 0, (0, 255, 0), 3)

    # تحديد الشكل بناءً على عدد الأضلاع
    if len(approx) == 3:
        shape_name = "مثلث"
    elif len(approx) == 4:
        shape_name = "مستطيل"
    elif len(approx) > 5:
        shape_name = "دائرة"
    else:
        shape_name = "غير معروف"

    # كتابة اسم الشكل على الصورة
    x, y = approx[0][0]
    cv2.putText(image, shape_name, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

cv2.imshow("Shapes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

ما يفعله هذا الكود:

  • يحدد الأشكال بناءً على عدد الأضلاع.
  • يرسم المستطيلات، المثلثات، والدوائر باللون الأخضر.
  • يكتب اسم كل شكل على الصورة.

التعرف على الوجوه باستخدام Haar Cascades

يستخدم OpenCV خوارزميات Haar Cascades لاكتشاف الوجوه بسرعة وكفاءة. هذه الطريقة تعتمد على التعرف على الأنماط داخل الصور.

تحميل نموذج Haar للكشف عن الوجوه

قبل تشغيل الكود، تأكد من تحميل ملف haarcascade_frontalface_default.xml من OpenCV.

كود التعرف على الوجوه في صورة ثابتة:

import cv2

# تحميل نموذج كشف الوجوه
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

# تحميل الصورة
image = cv2.imread("face.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# اكتشاف الوجوه
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# رسم مستطيل حول كل وجه
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow("Face Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

كيف يعمل؟

  • يقوم بتحويل الصورة إلى تدرجات الرمادي لزيادة سرعة الكشف.
  • يستخدم detectMultiScale() للبحث عن الوجوه في الصورة.
  • يرسم مستطيلات خضراء حول الوجوه المكتشفة.

تشغيل الكشف عن الوجوه في الفيديو المباشر (كاميرا الويب):

import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

cap = cv2.VideoCapture(0)  # تشغيل الكاميرا

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow("Face Detection Live", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

هذا الكود يقوم بـ:
التقاط الفيديو من كاميرا الويب.
الكشف عن الوجوه في الزمن الحقيقي.
رسم مستطيل حول كل وجه مكتشف.

اكتشاف العيون والابتسامات باستخدام Haar Cascades

يمكننا أيضًا اكتشاف العيون والابتسامات في الصور والفيديوهات باستخدام نماذج جاهزة من OpenCV.

كود التعرف على العيون داخل الوجوه:

import cv2

# تحميل نماذج Haar للكشف عن الوجوه والعيون
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")

# تحميل الصورة
image = cv2.imread("face.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# كشف الوجوه
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
    roi_gray = gray[y:y + h, x:x + w]
    roi_color = image[y:y + h, x:x + w]

    # كشف العيون داخل الوجه
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imshow("Face and Eye Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

هذا الكود:

  • يحدد الوجوه أولًا، ثم يبحث داخلها عن العيون.
  • يرسم مستطيلات زرقاء حول الوجوه و خضراء حول العيون.

التقنيات المتقدمة في OpenCV: تحسين تحليل الصور والفيديوهات

بعد أن تعلمنا الأساسيات في OpenCV مثل التعامل مع الصور والفيديوهات والتعرف على الأشكال والوجوه، سننتقل الآن إلى التقنيات المتقدمة التي تساعد على تحليل الصور والفيديو بطريقة احترافية. سنتحدث عن:
تتبع الأجسام في الفيديو باستخدام طرق مثل MeanShift وCamShift.
استخراج الملامح الأساسية باستخدام ORB, SIFT, وSURF.
معالجة الصور بالاعتماد على العمليات المورفولوجية (Morphological Operations).

تتبع الأجسام في الفيديو (Object Tracking)

تُستخدم تقنيات تتبع الأجسام لاكتشاف وتتبع حركة عنصر معين داخل الفيديو، مثل شخص أو مركبة. من الطرق الشائعة:

تتبع الأجسام باستخدام MeanShift

تعمل خوارزمية MeanShift على البحث عن الموضع الجديد لجسم معين داخل الإطار التالي بناءً على كثافة الألوان.

كود تتبع جسم متحرك باستخدام MeanShift:

import cv2
import numpy as np

# تحميل الفيديو
cap = cv2.VideoCapture("video.mp4")

# قراءة أول إطار
ret, frame = cap.read()
x, y, w, h = 300, 200, 100, 100  # تحديد منطقة التتبع يدويًا
roi = frame[y:y+h, x:x+w]

# تحويل المنطقة إلى نموذج HSV وإنشاء قناع
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

# معايير التتبع
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

    # تطبيق MeanShift
    ret, track_window = cv2.meanShift(dst, (x, y, w, h), term_crit)
    x, y, w, h = track_window

    # رسم مستطيل حول الجسم المتحرك
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow("Tracking", frame)

    if cv2.waitKey(30) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

ما يفعله هذا الكود:

  • يحدد المنطقة الأولية للجسم يدويًا.
  • يستخدم MeanShift لتحديث موضع الجسم في كل إطار.
  • يرسم مستطيلًا حول الجسم المتحرك.

تتبع الأجسام باستخدام CamShift

خوارزمية CamShift هي نسخة محسنة من MeanShift، حيث يمكنها تغيير حجم واتجاه النافذة أثناء التتبع.

كود تتبع جسم متحرك باستخدام CamShift:

ret, frame = cap.read()
x, y, w, h = 250, 90, 60, 60
track_window = (x, y, w, h)

roi = frame[y:y+h, x:x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

    # تطبيق CamShift
    ret, track_window = cv2.CamShift(dst, track_window, term_crit)
    
    pts = cv2.boxPoints(ret)
    pts = np.int0(pts)
    cv2.polylines(frame, [pts], True, (0, 255, 0), 2)

    cv2.imshow("CamShift Tracking", frame)

    if cv2.waitKey(30) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

ميزة CamShift أنها تتتبع الجسم مع التكيف مع حجمه واتجاهه أثناء الحركة.

استخراج الملامح الأساسية باستخدام ORB, SIFT, SURF

تقنيات مثل SIFT (Scale-Invariant Feature Transform) وSURF (Speeded-Up Robust Features) وORB (Oriented FAST and Rotated BRIEF) تُستخدم لاستخراج ملامح مهمة من الصور للتعرف على الأشياء وتحديد الفروقات بينها.

استخراج الملامح باستخدام ORB (بديل مفتوح المصدر لـ SIFT وSURF):

import cv2

# تحميل الصورة
image = cv2.imread("object.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# إنشاء كاشف ORB
orb = cv2.ORB_create()

# اكتشاف الملامح ووصفها
keypoints, descriptors = orb.detectAndCompute(gray, None)

# رسم الملامح على الصورة
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, (0, 255, 0), flags=0)

cv2.imshow("ORB Keypoints", image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

ORB أسرع من SIFT وSURF ومناسب لتطبيقات في الزمن الحقيقي.

معالجة الصور بالاعتماد على العمليات المورفولوجية (Morphological Operations)

تُستخدم العمليات المورفولوجية لتحسين معالجة الصور من خلال إزالة التشويش وملء الفجوات في الأشكال. تشمل العمليات الأساسية:

التآكل (Erosion) والتوسع (Dilation):

  • Erosion: يزيل الأجزاء البيضاء الصغيرة.
  • Dilation: يزيد من مساحة المناطق البيضاء.

كود تطبيق Erosion وDilation على صورة:

import cv2
import numpy as np

# تحميل الصورة بالأبيض والأسود
image = cv2.imread("text.png", 0)

# إنشاء مصفوفة نواة
kernel = np.ones((5,5), np.uint8)

# تطبيق التآكل والتوسع
erosion = cv2.erode(image, kernel, iterations=1)
dilation = cv2.dilate(image, kernel, iterations=1)

cv2.imshow("Original", image)
cv2.imshow("Erosion", erosion)
cv2.imshow("Dilation", dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()

استخدامات العمليات المورفولوجية:
تحسين الصور للنماذج الذكاء الاصطناعي.
إزالة الضوضاء من الصور الطبية والصناعية.

الربط بين OpenCV والذكاء الاصطناعي: الذكاء البصري في التطبيقات الحديثة

يُمكن دمج مكتبة OpenCV مع مكتبات الذكاء الاصطناعي مثل TensorFlow وPyTorch لإنشاء تطبيقات متقدمة في معالجة الصور والفيديو. في هذا القسم، سنتعرف على:
استخدام OpenCV مع TensorFlow وPyTorch لمعالجة الصور وتحليلها.
التعرف على الأجسام باستخدام YOLO وSSD واستخدامها لاكتشاف الكائنات.
تصفية وتحليل الصور باستخدام الشبكات العصبية لتحسين دقة التعرف على المحتوى.

استخدام OpenCV مع TensorFlow وPyTorch

TensorFlow وPyTorch هما أشهر مكتبات الذكاء الاصطناعي التي تُستخدم في معالجة الصور والفيديو. يمكن دمج OpenCV معهما لتحميل الصور ومعالجتها قبل إدخالها إلى الشبكة العصبية.

قراءة صورة ومعالجتها باستخدام OpenCV وTensorFlow

import cv2
import tensorflow as tf
import numpy as np

# تحميل الصورة وتحويلها إلى صيغة TensorFlow
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (224, 224))  # تغيير الحجم ليتناسب مع الشبكة العصبية
image = image / 255.0  # تطبيع القيم بين 0 و 1
image = np.expand_dims(image, axis=0)  # إضافة بعد جديد

# تحميل نموذج الذكاء الاصطناعي
model = tf.keras.applications.MobileNetV2(weights="imagenet")

# التنبؤ بالمحتوى
predictions = model.predict(image)
decoded_predictions = tf.keras.applications.mobilenet_v2.decode_predictions(predictions, top=3)

print(decoded_predictions)

ما يفعله هذا الكود:

  • يستخدم OpenCV لتحميل ومعالجة الصورة.
  • يقوم بتطبيع القيم بين 0 و 1 لتكون مناسبة للشبكة العصبية.
  • يستخدم MobileNetV2 المصمم للتعرف على الأشياء وتصنيفها.

معالجة الصور باستخدام OpenCV وPyTorch

import cv2
import torch
import torchvision.transforms as transforms
from PIL import Image

# تحميل الصورة وتحويلها إلى صيغة PyTorch
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)

# تحويل الصورة إلى Tensor
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

image = transform(image).unsqueeze(0)

# تحميل نموذج ResNet من PyTorch
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)
model.eval()

# التنبؤ بالمحتوى
output = model(image)
_, predicted = output.max(1)
print(predicted)

PyTorch يُفضل للبحث والتطوير لأنه أكثر مرونة من TensorFlow.

التعرف على الأجسام باستخدام YOLO وSSD

ما هو YOLO؟

YOLO (You Only Look Once) هو أحد أقوى النماذج لاكتشاف الأجسام، ويتميز بسرعته العالية ودقته الممتازة في تحديد الكائنات المختلفة في الصور والفيديوهات.

تحميل واستخدام YOLO لاكتشاف الأجسام باستخدام OpenCV

import cv2
import numpy as np

# تحميل أسماء الكائنات المدعومة من YOLO
with open("coco.names", "r") as f:
    labels = f.read().strip().split("\n")

# تحميل نموذج YOLO والوزن المدرب
net = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# تحميل الصورة
image = cv2.imread("image.jpg")
height, width = image.shape[:2]

# تحويل الصورة إلى Blob وإرسالها إلى الشبكة العصبية
blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
detections = net.forward(output_layers)

# تحليل نتائج YOLO
for detection in detections:
    for obj in detection:
        scores = obj[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]

        if confidence > 0.5:  # فقط الكائنات التي لديها ثقة أعلى من 50%
            box = obj[0:4] * np.array([width, height, width, height])
            (center_x, center_y, w, h) = box.astype("int")

            x = int(center_x - w / 2)
            y = int(center_y - h / 2)

            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
            cv2.putText(image, labels[class_id], (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

cv2.imshow("YOLO Object Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

ما يفعله هذا الكود:

  • يستخدم OpenCV وYOLOv4 لاكتشاف الكائنات في الصور.
  • يحدد ويصنف الأشياء مثل السيارات، الأشخاص، الحيوانات، وغيرها.

تصفية وتحليل الصور باستخدام الشبكات العصبية

الشبكات العصبية العميقة قادرة على تحليل الصور بدقة عالية، ويمكن استخدامها في تصفية الصور، إزالة الضوضاء، وتوليد صور محسنة.

إزالة الضوضاء باستخدام Autoencoder في TensorFlow

import tensorflow as tf
import cv2
import numpy as np

# تحميل الصورة وإضافة ضوضاء
image = cv2.imread("image.jpg", 0)
noisy_image = image + np.random.normal(0, 25, image.shape)
noisy_image = np.clip(noisy_image, 0, 255).astype(np.uint8)

# تحميل نموذج الشبكة العصبية لإزالة الضوضاء
autoencoder = tf.keras.models.load_model("denoiser_model.h5")

# تحويل الصورة إلى تنسيق الشبكة العصبية
input_image = noisy_image / 255.0
input_image = np.expand_dims(input_image, axis=(0, -1))

# تحسين الصورة
denoised_image = autoencoder.predict(input_image)[0, :, :, 0] * 255
denoised_image = denoised_image.astype(np.uint8)

# عرض النتائج
cv2.imshow("Noisy Image", noisy_image)
cv2.imshow("Denoised Image", denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

هذا النموذج يستخدم الشبكات العصبية لإزالة الضوضاء من الصور بشكل تلقائي.

خاتمة: مستقبل OpenCV ومعالجة الصور بالذكاء الاصطناعي

مكتبة OpenCV تُعتبر من أقوى الأدوات في مجال معالجة الصور والفيديو، وتستخدم على نطاق واسع في الذكاء الاصطناعي، الرؤية الحاسوبية، والتطبيقات العملية مثل التعرف على الأوجه، تتبع الأجسام، وتحليل البيانات البصرية.

ملخص لأهم ميزات OpenCV

مجانية ومفتوحة المصدر، مما يجعلها متاحة للمطورين والباحثين.
أداء عالٍ مع دعم تسريع المعالجة عبر CUDA وOpenCL.
دعم واسع للغات البرمجة مثل Python، C++، Java.
إمكانيات متقدمة تشمل معالجة الصور، تتبع الأجسام، التعرف على الأشكال، وتحليل الفيديو.
تكامل قوي مع مكتبات الذكاء الاصطناعي مثل TensorFlow وPyTorch لتطوير تطبيقات متقدمة.

مستقبل OpenCV في الذكاء الاصطناعي ومعالجة الصور

مع تطور تقنيات التعلم العميق، ستصبح OpenCV أكثر تكاملًا مع الشبكات العصبية لتحليل الصور والفيديو بذكاء أعلى.
دعم متزايد لتقنيات الرؤية الحاسوبية في التطبيقات العملية مثل القيادة الذاتية، الرعاية الصحية، والتجارة الإلكترونية.
تحسين الأداء باستخدام المعالجات الرسومية (GPUs) وتقنيات الذكاء الاصطناعي السحابية لمعالجة البيانات بسرعة فائقة.

نصائح للبدء في مشاريع OpenCV العملية

ابدأ بالمفاهيم الأساسية مثل قراءة الصور ومعالجتها، ثم انتقل إلى تطبيقات متقدمة.
استفد من الدورات والوثائق الرسمية على موقع OpenCV.
جرب مشاريع حقيقية مثل التعرف على الأوجه، تتبع الحركة، ومعالجة الفيديوهات.
استخدم الذكاء الاصطناعي لتطوير تطبيقات أكثر ذكاءً باستخدام YOLO، TensorFlow، وPyTorch.
شارك مشاريعك مع المجتمع البرمجي للاستفادة من التجارب والخبرات المختلفة.

مستعد للانطلاق؟ جرب OpenCV اليوم وابدأ ببناء تطبيقاتك الذكية!

حول المحتوى:

تعرف على مكتبة OpenCV في بايثون، الأداة الرائدة في معالجة الصور والفيديوهات باستخدام تقنيات الرؤية الحاسوبية. استكشف كيفية تثبيت OpenCV، تحميل الصور، تطبيق الفلاتر الأساسية مثل الضبابية والكشف عن الحواف، بالإضافة إلى تعلم كيفية اكتشاف الأشكال الهندسية والتعرف على الوجوه باستخدام تقنيات مثل Haar Cascades. تعلم كيفية التعامل مع الفيديوهات، تطبيق تأثيرات الفيديو، واستخدام OpenCV مع الذكاء الاصطناعي مثل TensorFlow وPyTorch. ابدأ في بناء مشاريع عملية باستخدام OpenCV مثل التعرف على الأجسام باستخدام YOLO وSSD. اطلع على تقنيات متقدمة مثل تتبع الأجسام باستخدام الشبكات العصبية، استخراج الملامح الأساسية، وعملية التحسين باستخدام الذكاء الاصطناعي.