مقدمة عن مكتبة 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 إصدارين رئيسيين:
- opencv-python: الإصدار الأساسي الذي يحتوي على الوظائف الأساسية لمعالجة الصور والفيديو.
- 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()
النتيجة: يتم عرض الحواف فقط، مما يسهل اكتشاف الأجسام المتحركة أو تحديد الأشكال في الفيديو.
تابع الى المقال التالي : نشرح فيه كيفية التعرف على الأجسام.