حول المحتوى:
تعلم كيفية استخدام مكتبة OpenCV في بايثون لاكتشاف الأشكال الهندسية والتعرف على الوجوه في الصور ومقاطع الفيديو. هذه التدوينة تغطي أساسيات معالجة الصور، استخدام خوارزميات الكشف عن الحواف، وتقنيات التعرف على الوجوه باستخدام Haar Cascades.
اذا كانت هذه المعلومات متقدمة نوعا ما حاول قراءة المقال السابق .
بعد تعلم كيفية التعامل مع الصور والفيديوهات، سننتقل الآن إلى التعرف على الأشكال الهندسية والوجوه باستخدام مكتبة OpenCV. سنتناول:
اكتشاف الأشكال الهندسية (المستطيلات، الدوائر، وغيرها).
التعرف على الوجوه باستخدام Haar Cascades وDeep Learning Models.
اكتشاف العيون والابتسامات في الصور والفيديوهات.
يمكننا استخدام تحليل الحواف واكتشاف المضلعات لاستخراج الأشكال الهندسية من الصور.
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()
ما يفعله هذا الكود:
يستخدم OpenCV خوارزميات Haar Cascades لاكتشاف الوجوه بسرعة وكفاءة. هذه الطريقة تعتمد على التعرف على الأنماط داخل الصور.
قبل تشغيل الكود، تأكد من تحميل ملف 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()
هذا الكود يقوم بـ:
التقاط الفيديو من كاميرا الويب.
الكشف عن الوجوه في الزمن الحقيقي.
رسم مستطيل حول كل وجه مكتشف.
يمكننا أيضًا اكتشاف العيون والابتسامات في الصور والفيديوهات باستخدام نماذج جاهزة من 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 مثل التعامل مع الصور والفيديوهات والتعرف على الأشكال والوجوه، سننتقل الآن إلى التقنيات المتقدمة التي تساعد على تحليل الصور والفيديو بطريقة احترافية. سنتحدث عن:
تتبع الأجسام في الفيديو باستخدام طرق مثل MeanShift وCamShift.
استخراج الملامح الأساسية باستخدام ORB, SIFT, وSURF.
معالجة الصور بالاعتماد على العمليات المورفولوجية (Morphological Operations).
تُستخدم تقنيات تتبع الأجسام لاكتشاف وتتبع حركة عنصر معين داخل الفيديو، مثل شخص أو مركبة. من الطرق الشائعة:
تعمل خوارزمية 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()
ما يفعله هذا الكود:
خوارزمية 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 أنها تتتبع الجسم مع التكيف مع حجمه واتجاهه أثناء الحركة.
تقنيات مثل SIFT (Scale-Invariant Feature Transform) وSURF (Speeded-Up Robust Features) وORB (Oriented FAST and Rotated BRIEF) تُستخدم لاستخراج ملامح مهمة من الصور للتعرف على الأشياء وتحديد الفروقات بينها.
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 ومناسب لتطبيقات في الزمن الحقيقي.
تُستخدم العمليات المورفولوجية لتحسين معالجة الصور من خلال إزالة التشويش وملء الفجوات في الأشكال. تشمل العمليات الأساسية:
كود تطبيق 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 مع مكتبات الذكاء الاصطناعي مثل TensorFlow وPyTorch لإنشاء تطبيقات متقدمة في معالجة الصور والفيديو. في هذا القسم، سنتعرف على:
استخدام OpenCV مع TensorFlow وPyTorch لمعالجة الصور وتحليلها.
التعرف على الأجسام باستخدام YOLO وSSD واستخدامها لاكتشاف الكائنات.
تصفية وتحليل الصور باستخدام الشبكات العصبية لتحسين دقة التعرف على المحتوى.
TensorFlow وPyTorch هما أشهر مكتبات الذكاء الاصطناعي التي تُستخدم في معالجة الصور والفيديو. يمكن دمج OpenCV معهما لتحميل الصور ومعالجتها قبل إدخالها إلى الشبكة العصبية.
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)
ما يفعله هذا الكود:
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 (You Only Look Once) هو أحد أقوى النماذج لاكتشاف الأجسام، ويتميز بسرعته العالية ودقته الممتازة في تحديد الكائنات المختلفة في الصور والفيديوهات.
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()
ما يفعله هذا الكود:
الشبكات العصبية العميقة قادرة على تحليل الصور بدقة عالية، ويمكن استخدامها في تصفية الصور، إزالة الضوضاء، وتوليد صور محسنة.
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 تُعتبر من أقوى الأدوات في مجال معالجة الصور والفيديو، وتستخدم على نطاق واسع في الذكاء الاصطناعي، الرؤية الحاسوبية، والتطبيقات العملية مثل التعرف على الأوجه، تتبع الأجسام، وتحليل البيانات البصرية.
مجانية ومفتوحة المصدر، مما يجعلها متاحة للمطورين والباحثين.
أداء عالٍ مع دعم تسريع المعالجة عبر CUDA وOpenCL.
دعم واسع للغات البرمجة مثل Python، C++، Java.
إمكانيات متقدمة تشمل معالجة الصور، تتبع الأجسام، التعرف على الأشكال، وتحليل الفيديو.
تكامل قوي مع مكتبات الذكاء الاصطناعي مثل TensorFlow وPyTorch لتطوير تطبيقات متقدمة.
مع تطور تقنيات التعلم العميق، ستصبح OpenCV أكثر تكاملًا مع الشبكات العصبية لتحليل الصور والفيديو بذكاء أعلى.
دعم متزايد لتقنيات الرؤية الحاسوبية في التطبيقات العملية مثل القيادة الذاتية، الرعاية الصحية، والتجارة الإلكترونية.
تحسين الأداء باستخدام المعالجات الرسومية (GPUs) وتقنيات الذكاء الاصطناعي السحابية لمعالجة البيانات بسرعة فائقة.
ابدأ بالمفاهيم الأساسية مثل قراءة الصور ومعالجتها، ثم انتقل إلى تطبيقات متقدمة.
استفد من الدورات والوثائق الرسمية على موقع OpenCV.
جرب مشاريع حقيقية مثل التعرف على الأوجه، تتبع الحركة، ومعالجة الفيديوهات.
استخدم الذكاء الاصطناعي لتطوير تطبيقات أكثر ذكاءً باستخدام YOLO، TensorFlow، وPyTorch.
شارك مشاريعك مع المجتمع البرمجي للاستفادة من التجارب والخبرات المختلفة.
مستعد للانطلاق؟ جرب OpenCV اليوم وابدأ ببناء تطبيقاتك الذكية!
تعلم كيفية استخدام مكتبة OpenCV في بايثون لاكتشاف الأشكال الهندسية والتعرف على الوجوه في الصور ومقاطع الفيديو. هذه التدوينة تغطي أساسيات معالجة الصور، استخدام خوارزميات الكشف عن الحواف، وتقنيات التعرف على الوجوه باستخدام Haar Cascades.
مساحة اعلانية
المكتبات في البرمجة هي مجموعات من الكود المكتوب مسبقًا التي يمكن للمطورين استخدامها لتحسين سير عملهم. توفر دوال، وفئات، ووحدات قابلة لإعادة الاستخدام لأداء مهام محددة، مما يقلل من الحاجة إلى كتابة الكود من البداية. يمكن أن تغطي المكتبات مجموعة واسعة من الوظائف، مثل معالجة البيانات، العمليات الرياضية، تطوير الويب، والمزيد.