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

اذا كانت هذه المعلومات متقدمة نوعا ما حاول قراءة المقال السابق .

التعرف على الأشكال والوجوه باستخدام 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 في بايثون لاكتشاف الأشكال الهندسية والتعرف على الوجوه في الصور ومقاطع الفيديو. هذه التدوينة تغطي أساسيات معالجة الصور، استخدام خوارزميات الكشف عن الحواف، وتقنيات التعرف على الوجوه باستخدام Haar Cascades.