OpenCV
OpenCV مكتبة مفتوحة المصدر تضم أكثر من 2,500 خوارزمية لمعالجة الصور والرؤية الحاسوبية. تعرّف إلى وظائفها، وكيفية دمجها مع التعلّم العميق، مع أمثلة برمجية.
OpenCV (مكتبة الرؤية الحاسوبية مفتوحة المصدر) هي مكتبة مفتوحة المصدر تضم أكثر من 2,500 خوارزمية محسّنة لـمعالجة الصور والرؤية الحاسوبية (CV). تقرأ الصور والفيديو وتكتبهما، وتلتقط تدفقات الكاميرا، وترشّح البكسلات وتحولها، وتكتشف السمات وتطابقها، وتعاير الكاميرات، وتشغّل الشبكات العصبية المدرّبة. بدأت OpenCV في Intel Research عام 1999، وهي مكتوبة بلغة C++ مع روابط لـPython وJava، ووُزّعت بموجب ترخيص Apache 2.0 منذ الإصدار 4.5.0. تُثبَّت في Python باستخدام pip install opencv-python وتُستورد باسم cv2، وتمثّل كل صورة كمصفوفة NumPy.
مهام OpenCV#
- إدخال وإخراج الصور والفيديو: قراءة تنسيقات الصور الشائعة وكتابتها، وفك ترميز ملفات الفيديو، والتقاط الإطارات من الكاميرات وتدفقات الشبكة.
- معالجة الصور: تغيير الحجم وتحويل فضاء الألوان والتغبيش وزيادة الحدة وتطبيق العتبات والعمليات المورفولوجية؛ وهي خطوات المعالجة المسبقة المعتادة قبل وصول الصورة إلى النموذج.
- اكتشاف السمات ومطابقتها: تعثر كواشف الزوايا والنقاط المفتاحية مثل SIFT وORB على نقاط مميزة يمكن مطابقتها بين الصور لتجميع الصور البانورامية وتحديد مواقع الكائنات وتطبيق SLAM البصري. أُدرج SIFT في المكتبة الرئيسية في الإصدار 4.4.0 بعد انتهاء صلاحية براءة اختراعه.
- هندسة الكاميرا: تزيل المعايرة تشوه العدسة، وتصحّح التحويلات الإسقاطية المنظور، وتستعيد المطابقة المجسّمة العمق من كاميرتين لأغراض الروبوتات وإعادة البناء ثلاثي الأبعاد.
- تحليل الفيديو: يفصل طرح الخلفية الكائنات المتحركة عن المشهد الثابت، ويقيس التدفق البصري حركة البكسلات بين الإطارات.
- استدلال الشبكات العصبية العميقة: تحمّل الوحدة
dnnالنماذج المدرّبة، مثل النماذج بتنسيق ONNX، وتشغّلها على CPU أو GPU من دون تثبيت إطار عمل للتعلّم العميق.
يعثر مسار المعالجة التقليدي هذا على حدود الأشكال في صورة من دون أي نموذج متعلّم:
import urllib.request
import cv2
import numpy as np
# Download a sample image and decode it into a BGR NumPy array
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)
# Classical pipeline: grayscale, blur to suppress noise, then Canny edge detection
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Trace connected edge pixels into contours, the outlines of shapes in the scene
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f"Image shape: {image.shape}, contours found: {len(contours)}")يطبع Image shape: (1080, 810, 3), contours found: 1449: صورة بأبعاد 1080×810 وثلاث قنوات لونية، و1,449 حدًا منفصلًا مستخرجًا من حوافها. تخزّن OpenCV قنوات الألوان بترتيب الأزرق والأخضر والأحمر (BGR)، لذا يجب تحويل الصور الممرّرة إلى المكتبات التي تتوقع RGB باستخدام cv2.cvtColor أولًا.
OpenCV وأطر عمل التعلّم العميق#
تعمل OpenCV وأطر عمل التعلّم العميق مثل PyTorch وTensorFlow في مراحل مختلفة من مسار المعالجة نفسه. تتولى OpenCV المعالجة المسبقة للبيانات وإخراج النتائج حول الشبكة، فتلتقط الإطارات وتغيّر أحجامها وترسم النتائج وتكتب فيديو الخرج؛ بينما يتولى إطار العمل تدريب الشبكة العصبية الالتفافية وتشغيلها في المرحلة الفاصلة. ويكرّر تطبيق الفيديو الآني هذه الخطوات لكل إطار:
يقبل Ultralytics YOLO26 إطارات NumPy بصيغة BGR من OpenCV مباشرةً، ويعيد results[0].plot() إطارًا مشروحًا بالتنسيق نفسه، لذلك يمكن إدراج النموذج في حلقة OpenCV من دون أي تحويل. يشغّل هذا المثال دورة واحدة من الحلقة على صورة العينة المضمّنة في حزمة ultralytics:
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# تحمّل OpenCV صورة العينة المضمّنة كمصفوفة NumPy بصيغة BGR
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# يستقبل YOLO26 إطار OpenCV مباشرةً
model = YOLO("yolo26n.pt")
results = model(frame)
# تعيد plot() مصفوفة BGR مشروحة يمكن لـOpenCV عرضها أو حفظها
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)داخل حلقة الفيديو، تُنفَّذ الاستدعاءات الثلاثة نفسها على كل إطار من cv2.VideoCapture، ويحل cv2.imshow أو cv2.VideoWriter محل cv2.imwrite.










