- 1. عمليات Bitwise والإخفاء
- 2. الالتفاف والتعتيم
- 3. التوضيح - عكس الصورة ضبابية
- 4. الدرس (ثنائي)
- 5. تمدد ، تآكل ، فتح / إغلاق
- 6. كشف الحواف وتدرجات الصورة
- 14. تحويل منظور & Affine
- 8. تطبيق Live Sketch
في البرامج التعليمية السابقة ، تعلمنا عن OpenCV وقمنا ببعض عمليات معالجة الصور الأساسية ، ثم في البرنامج التعليمي التالي قمنا ببعض التلاعب بالصور في OpenCV مثل الاقتصاص ، والتناوب ، وتحويل الصورة ، وما إلى ذلك ، لذا في متابعة مع البرنامج التعليمي السابق لمعالجة الصور ، هنا نتعلم بعض تقنيات معالجة الصور الأخرى مثل وفي نهاية البرنامج التعليمي سنقوم ببناء برنامج python-opencv لعمل رسم مباشر من البث المباشر لكاميرا الويب. سيستخدم هذا التطبيق العديد من وظائف معالجة الصور التي تعلمناها حتى الآن أو سنتعلمها في هذا البرنامج التعليمي ، لذلك سيكون هذا مثالًا عمليًا جيدًا لتغطية جميع الوظائف.
كما قيل في البرنامج التعليمي السابق ، OpenCV هي مكتبة رؤية مفتوحة المصدر تحتوي على واجهات C ++ و Python و Java وتدعم أنظمة التشغيل Windows و Linux و Mac OS و iOS و Android. لذلك يمكن تثبيته بسهولة في Raspberry Pi مع بيئة Python و Linux. ويمكن استخدام Raspberry Pi مع OpenCV والكاميرا المرفقة لإنشاء العديد من تطبيقات معالجة الصور في الوقت الفعلي مثل اكتشاف الوجه وقفل الوجه وتتبع الكائن واكتشاف لوحة أرقام السيارة ونظام أمن المنزل وما إلى ذلك.
في هذا البرنامج التعليمي ، سنرى المزيد من عمليات التلاعب بالصور باستخدام Python OpenCV. هنا سوف نتعلم كيفية تطبيق الوظيفة التالية على صورة باستخدام Python OpenCV:
- عمليات Bitwise والإخفاء
- الالتفاف والتشويش
- شحذ - عكس الصورة ضبابية
- عتبة (ثنائية)
- تمدد ، تآكل ، فتح / إغلاق
- كشف الحواف وتدرجات الصورة
- منظور وتحويل أفيني
- تطبيق Live Sketch
1. عمليات Bitwise والإخفاء
تساعدك عمليات Bitwise في إخفاء الصورة وتساعدك على إنشاء بعض الصور البسيطة.
صنع مربع
استيراد cv2 استيراد numpy كـ np # نستخدم بعدين فقط لأن هذه صورة ذات تدرج رمادي ، إذا كنا نستخدم # صورة ملونة ، فقد استخدمنا مستطيلًا = np.zeros ((300،300،3)، np.uint8) # تكوين مربع = np.zeros ((300،300)، np.uint8) cv2.rectangle (مربع، (50،50)، (250،250)، 255، -1) cv2.imshow ("مربع" ، مربع) cv2. waitKey (0)
صنع القطع الناقص
القطع الناقص = np.zeros ((300،300)، np.uint8) cv2.ellipse (ellipse، (150،150)، (150،150)، 30،0،180،255، -1) cv2.imshow ("ellipse"، ellipse) cv2.waitKey (0)
تجربة العمليات الأحادية
# و_عرض فقط حيث يتقاطع الاثنان
BitwiseAND = cv2.bitwise_and (مربع ، قطع ناقص) cv2.imshow ("AND"، BitwiseAND) cv2.waitKey (0)
#OR_shows فقط حيث يكون المربع أو القطع الناقص
BitwiseOR = cv2.bitwise_or (مربع ، قطع ناقص) cv2.imshow ("OR"، BitwiseOR) cv2.waitKey (0)
#XOR_shows فقط حيث يوجد أحدهما بنفسه
BitwiseXOR = cv2.bitwise_xor (مربع ، قطع ناقص) cv2.imshow ("XOR"، BitwiseXOR) cv2.waitKey (0)
#NOT_shows كل شيء ليس جزءًا من القطع الناقص ولا يمكن تطبيق عملية NOT إلا على شكل واحد
BitwiseNOT_elp = cv2.bitwise_not (القطع الناقص) cv2.imshow ("NOT_ellipse"، BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. الالتفاف والتعتيم
و الالتواء هو عملية حسابية أجريت على وظيفتين إنتاج الوظيفة الثالثة والذي هو عادة نسخة معدلة من الوظيفة الأصلية.
صورة الإخراج = صورة وظيفة حجم النواة
في رؤية الكمبيوتر ، نستخدم النواة لتحديد الحجم الذي ندير عليه وظيفة التلاعب على صورتنا.
التعتيم هو عملية نقوم فيها بتوسيط وحدات البكسل داخل منطقة ما (Kernel)
يقوم OpenCV بتمويه الصورة عن طريق تطبيق النواة ، تخبرك النواة بكيفية تغيير قيمة أي بكسل معين عن طريق دمجها مع كمية مختلفة من وحدات البكسل المجاورة ، يتم تطبيق النواة على كل بكسل في الصورة واحدًا تلو الآخر لإنتاج الصورة النهائية.
ببساطة نقول ، إن التفاف الصورة هو ببساطة مضاعفة حكيمة لمصفوفتين متبوعين بمجموع.
يمكننا ببساطة فهمه من خلال المثال التالي.
ما ورد أعلاه هو نواة 3X3.
نضرب في 1/25 لتطبيع أي مجموع إلى 1 كنا نزيد كثافة أو نخفض شدة كما في حالة تفتيح أو تعتيم الصور.
دعونا نختبر طريقة opencv blurring filter2D ، المعطاة بواسطة الوظيفة cv2.filter2D (image، -1، kernel)
استيراد cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original'، image) cv2.waitKey (0)
# إنشاء مصفوفة نواة 3x3
kernel_3x3 = np.ones ((3،3)، np.float32) / 9
# نستخدم cv2.filter2D لربط النواة بصورة
blurred = cv2.filter2D (image، -1، kernel_3x3) cv2.imshow ('3x3_blurring'، blurred) cv2.waitKey (0)
# إنشاء مصفوفة نواة 7 × 7
kernel_7x7 = np.ones ((7،7)، np.float32) / 49
# نستخدم cv2.filter2D لربط النواة بصورة
blurred = cv2.filter2D (image، -1، kernel_7x7) cv2.imshow ('7x7_blurring'، blurred) cv2.waitKey (0) cv2.destroyAllWindows ()
هناك أنواع أخرى من طرق التعتيم أيضًا:
cv2.blur - متوسط القيمة عبر نافذة محددة.
cv2.GaussianBlur - مماثلة لكنها تستخدم نافذة Gaussian (مزيد من التركيز على النقاط حول المركز).
cv2.medianBlur- يستخدم الوسيط لجميع العناصر في النافذة.
cv2.bsideFilter- تمويه مع الحفاظ على الحواف حادة ، فإنه يحافظ على الحواف وتفاصيل الخط.
سنرى واحدًا تلو الآخر أدناه ، قم أولاً بعرض الصورة الأصلية باستخدام الكود أدناه:
استيراد cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original'، image) cv2.waitKey (0)
cv2.blur:
في هذه الطريقة ، يتم إجراء المتوسط عن طريق تحويل الصورة باستخدام مرشح الصندوق الطبيعي ، وهذا يأخذ المكان تحت الصندوق ويستبدل العنصر المركزي. هنا يجب أن يكون حجم الصندوق غريبًا وإيجابيًا .
# cv2.blur blur = cv2.blur (صورة ، (3،3)) cv2.imshow ('Averaging'، blur) cv2.waitKey (0)
cv2.GaussianBlur:
# cv2.GaussianBlur # بدلاً من مرشح الصندوق ، لنجرب Gaussian kernel Gaussian = cv2.GaussianBlur (image، (7،7)، 0) cv2.imshow ('Gaussian blurring'، Gaussian) cv2.waitKey (0)
cv2.medianBlur:
يأخذ متوسط جميع وحدات البكسل الموجودة أسفل منطقة kernel ويتم استبدال العنصر المركزي بهذه القيمة المتوسطة.
# cv2.medianBlur #takes متوسط جميع وحدات البكسل الموجودة تحت منطقة kernel والعنصر المركزي # يتم استبداله بهذه القيمة المتوسطة. متوسط = cv2.medianBlur (صورة 5) cv2.imshow ('متوسط ضوح، متوسط) cv2.waitKey (0)
المرشح:
الثنائي فعال للغاية في إزالة الضوضاء مع الحفاظ على الحواف حادة
# cv2.bidedFilter #Bided فعال للغاية في إزالة الضوضاء مع الحفاظ على الحواف حادة ثنائية = cv2.bidedFilter (صورة ، 9،75،75) cv2.imshow ('ضبابية ثنائية' ، ثنائية) cv2.waitKey (0) cv2. تدمير جميع النوافذ ()
إزالة الضوضاء-غير المحلية تعني تقليل الضوضاء
استيراد cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original'، image) cv2.waitKey (0)
# المعلمة بعد لا شيء هي قوة المرشح 'h' (5-10 هي نطاق جيد) #next هي h لمكونات اللون ، يتم تعيينها بنفس قيمة h مرة أخرى
dst = cv2.fastNlMeansDenoisingColored (image، None، 6،6،7،21) cv2.imshow ('Fast يعني denois'، dst) cv2.waitKey (0) cv2.destroyAllWindows ()
هناك 4 أشكال مختلفة من الوسائل غير المحلية لتقليل الضوضاء
cv2.fastNlMeansDenoising () - لصورة ذات مقياس رمادي واحد
cv2.fastNlMeansDenoisingColored () - صورة ملونة واحدة
cv2.fastNlmeansDenoisingMulti () - لتسلسل الصور بالتدرج الرمادي
cv2.fastNlmeansDenisingcoloredMulti () - لتسلسل الصور الملونة
3. التوضيح - عكس الصورة ضبابية
الحدة هي عكس التعتيم ، فهي تقوي الحواف في الصورة أو تشدد عليها.
Kernel = ،،
تلخص مصفوفة النواة الخاصة بنا ما يصل إلى واحد ، لذلك ليست هناك حاجة للتطبيع (على سبيل المثال ، الضرب في عامل إلى نفس السطوع الأصلي) ، إذا لم يتم تسوية النواة إلى 1 ، فستكون الصورة أكثر إشراقًا أو أغمق.
استيراد cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original'، image) cv2.waitKey (0)
kernel_sharpening = np.array (،
و
])
# تطبيق شحذ النواة لإدخال الصورة
شحذ = cv2.filter2D (صورة ، -1 ، kernel_sharpening) cv2.imshow ('صورة حادة' ، شحذ) cv2.waitKey (0) cv2.destroyAllWindows ()
4. الدرس (ثنائي)
العتبة هي عملية تحويل صورة إلى شكل ثنائي. في opencv هناك وظيفة منفصلة للعتبة المعرفة على أنها
Cv2.threshold (الصورة ، قيمة العتبة ، الحد الأقصى للقيمة ، نوع العتبة)
هناك أنواع العتبات التالية:
- cv2.THRESH_BINARY - الأكثر شيوعًا
- السيرة الذاتية 2. THRESH_BINARY_INV - الأكثر شيوعًا
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- السيرة الذاتية 2. THRESH_TOZERO_INV
ملاحظة: الصورة مطلوبة ليتم تحويلها إلى تدرج الرمادي قبل العتبة
import cv2 import numpy as np #load image as grayscale image = cv2.imread ('gradient.jpg'، 0) cv2.imshow ('original'، image) cv2.waitKey (0)
# القيمة أدناه 127 انتقل إلى 0 (أسود) ، وما فوق 127 يذهب إلى 255 (أبيض)
_، thresh1 = cv2.threshold (صورة ، 127255 ، cv2.THRESH_BINARY) cv2.imshow ('1 عتبة' ، عتبة 1) cv2.waitKey (0)
# القيمة أقل من 127 تذهب إلى 255 والقيم أعلى من 127 تذهب إلى 0 (عكس أعلاه)
_، thresh2 = cv2.threshold (صورة ، 127255 ، cv2.THRESH_BINARY_INV) cv2.imshow ('2 عتبة' ، عتبة 2) cv2.waitKey (0)
#value فوق 127 مقطوع (معلق) عند 127 ، وسيطة 255 غير مستخدمة.
_، thresh3 = cv2.threshold (صورة ، 127255 ، cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc'، thresh3) cv2.waitKey (0)
# القيم أقل من 127 تذهب إلى 0 ، فوق 127 لم تتغير
_، thresh4 = cv2.threshold (صورة ، 127255 ، cv2.THRESH_TOZERO) cv2.imshow ('4 عتبة' ، عتبة 4) cv2.waitKey (0)
#Revesrse من أعلاه ، أقل من 127 لم يتغير ، فوق 127 يذهب إلى الصفر
_، thresh5 = cv2.threshold (صورة ، 127.255 ، cv2.THRESH_TOZERO_INV) cv2.imshow ('5 threshold'، thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. تمدد ، تآكل ، فتح / إغلاق
هذه هي العمليات في مجال علم التشكل الرياضي
التوسيع - يضيف وحدات بكسل إلى حدود الكائن في الصورة.
تآكل - يزيل وحدات البكسل عند حدود الكائن في الصورة.
الافتتاح - تآكل يتبعه تمدد.
الإغلاق - تمدد يتبعه تآكل.
الفتح مفيد جدًا في تقليل التشويش على الصور لأنه يخفف الصورة أولاً عن طريق التآكل (يزيل التشويش) ثم يوسعها.
الخلط مع التمدد والتآكل
يوجد في بعض الأحيان التباس بين التمدد والتآكل عادة في الصور ذات الخلفية البيضاء ، حيث يعتبر opencv الخلفية البيضاء كصورة متوسعة أو متآكلة بدلاً من الصورة الأصلية ، لذلك في هذه الحالة يعمل التآكل كتوسيع والعكس صحيح كما هو موضح في عينة الصورة ظاهر أدناه.
تذكر أن Dilation يضيف وحدات بكسل إلى حدود الكائنات في الصورة بينما يزيل Erosion وحدات البكسل الموجودة في حدود الكائنات في الصورة
استيراد cv2 import numpy as np image = cv2.imread ('imagecv.png'، 0) cv2.imshow ('original'، image) cv2.waitKey (0)
#Erosion
# لنحدد حجم النواة لدينا
النواة = np.ones ((5،5)، np.uint8)
# الآن نقوم بتآكل الصورة ، هنا التكرار هو عدد المرات التي تريد فيها تآكل الصورة
تآكل = cv2.erode (صورة ، نواة ، تكرارات = 1) cv2.imshow ('تآكل' ، تآكل) cv2.waitKey (0)
#تمدد
تمدد = cv2.dilate (صورة ، نواة ، تكرارات = 1) cv2.imshow (تمدد ، تمدد) cv2.waitKey (0)
# فتح ، جيد لإزالة الضوضاء
الفتح = cv2.morphologyEx (صورة ، cv2.MORPH_OPEN ، نواة) cv2.imshow ('الفتح' ، الفتح) cv2.waitKey (0)
#closing ، جيد لإزالة الضوضاء
إغلاق = cv2.morphologyEx (صورة ، cv2.MORPH_CLOSE ، kernel) cv2.imshow ('إغلاق' ، إغلاق) cv2.waitKey (0) cv2.destroyAllWindows ()
6. كشف الحواف وتدرجات الصورة
يعد اكتشاف الحواف مجالًا مهمًا جدًا في رؤية الكمبيوتر ، خاصة عند التعامل مع الخطوط.
يمكن تعريف الحواف على أنها حدود للصورة ، فهي في الواقع حواف تحدد الكائن في الصور ، فهي تحافظ على الكثير من المعلومات حول الصورة.
يمكن تعريف الحواف رسميًا على أنها تغييرات مفاجئة (انقطاعات) في صورة ويمكنها ترميز قدر المعلومات مثل البكسل.
توضح الصورة أعلاه كيف تحدد رؤية الكمبيوتر الصورة وتتعرف عليها.
خوارزميات كشف الحواف : - هناك ثلاثة أنواع رئيسية من خوارزميات كشف الحواف
- سوبل - للتأكيد على الصور الرأسية أو الأفقية.
- لابلاسيان - مثالي بسبب معدل الخطأ المنخفض والحواف المحددة جيدًا والكشف الدقيق.
- خوارزمية الكشف عن حافة الحادة (تم تطويرها بواسطة John.F. Canny في عام 1986)
1. يطبق Gaussian blur
2. يجد كثافة التدرج للصورة
3. يطبق منعًا غير أقصى (أي يزيل البيكسلات التي ليست حوافًا).
4. يطبق التباطؤ الحد (أي إذا كان البكسل داخل العتبة العلوية والسفلية ، فإنه يعتبر حافة)
استيراد cv2 استيراد numpy كـ np image = cv2.imread ('input.jpg'، 0) height، width = image.shape
# سوبل
# استخراج حواف سوبل
sobel_x = cv2.Sobel (image، cv2.CV_64F، 0،1، ksize = 5) sobel_y = cv2.Sobel (image، cv2.CV_64F، 1،0، ksize = 5) cv2.imshow ('original'، image) cv2.waitKey (0) cv2.imshow ('sobelx'، sobel_x) cv2.waitKey (0)
# طيب
cv2.imshow ('sobely'، sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x، sobel_y) cv2.imshow ('sobelOR'، sobel_OR) cv2.waitKey (0)
# اللابلايان
laplacian = cv2.Laplacian (صورة ، cv2.CV_64F) cv2.imshow ('Laplacian' ، laplacian) cv2.waitKey (0)
تستخدم خوارزمية اكتشاف الحواف #canny قيم التدرج
كعتبات # في ماع ، نحتاج إلى تقديم قيمتين: العتبة 1 والعتبة 2.
# أي تدرج أكبر من العتبة 2 يعتبر حافة.
# لا يعتبر أي تدرج أكبر من العتبة 1 حافة.
#values بين عتبة 1 و 2 عتبة هي إما حافة أو غير الحافة
#on كيف ترتبط شدة، وفي هذه الحالة أي قيمة أقل من 60 و تعتبر
#non حواف wheareas تعتبر أي قيمة فوق 120 كما الحواف.
canny = cv2.Canny (صورة ، 60120) cv2.imshow ('canny'، canny) cv2.waitKey (0) cv2.destroyAllWindows ()
14. تحويل منظور & Affine
دعنا نتراجع خطوة إلى الوراء ونلقي نظرة على التحويلات الأفينية وغير الأفينية ، من الواضح أن الصورة الأصلية الموضحة أدناه هي صورة غير أفينية حيث ستلتقي الحواف في مرحلة ما ، ومع ذلك ، يمكننا تقويمها عن طريق التواء وأخذ المنظور تحول.
بالنسبة لتحويل المنظور هذا ، نحتاج إلى الإحداثيات الأربعة للصورة الأصلية ثم النقاط الأربع للصورة الناتجة ، ويُشار إليها بالنقطتين A و Points_B. أولاً ، بمساعدة هذه النقاط ، نحسب مصفوفة التحويل ، M بمساعدة دالة getPerspectiveTransform.
ثم تُعطى هذه المصفوفة إلى دالة warpPerspective لتوليد الناتج النهائي.
الآن دعنا نجرب أولاً تحويل المنظور.
استيراد cv2 استيراد numpy كـ np import matplotlib.pyplot as plt image = cv2.imread ('paper.jpg') cv2.imshow ('original'، image) cv2.waitKey (0)
# تنسيق 4 زوايا من الصورة الأصلية
Points_A = np.float32 (،،،])
# إحداثيات 4 زوايا من الإخراج المطلوب
# نستخدم نسبة ورق A4 1: 1.41
Points_B = np.float32 (،،،])
# استخدم مجموعتي النقطتين لحساب مصفوفة التحويل المتوقعة ، م
M = cv2.getPerspectiveTransform (Points_A، Points_B) مشوه = cv2.warpPerspective (image، M، (420،594)) cv2.imshow ('warpprespective'، warped) cv2.waitKey (0) cv2.destroyAllWindows ()
التحويل التقريبي أسهل من التحويل غير الأفيني لأننا نحتاج فقط إلى ثلاث نقاط للحصول على التحويل. تسير العملية برمتها كما هي ولكن بدلاً من تحويل المنظور ، أصبح لدينا الآن تحويل أفيني وأيضًا نحدد الأعمدة والصفوف في warpAffine من وظيفة الشكل بدلاً من إدخالها يدويًا.
استيراد cv2 استيراد numpy كـ np import matplotlib.pyplot as plt image = cv2.imread ('box.jpg') صفوف ، cols = image.shape cv2.imshow ('original'، image) cv2.waitKey (0)
# تنسيق 3 زوايا من الصورة الأصلية
Points_A = np.float32 (،،])
# تنسيقات 3 زوايا للإخراج المطلوب
# نستخدم نسبة ورق A4 1: 1.41
Points_B = np.float32 (،،])
# استخدم مجموعتين من نقطتين لحساب
مصفوفة التحويل # Affine ، M.
M = cv2.getAffineTransform (Points_A، Points_B) مشوه = cv2.warpAffine (image، M، (cols، rows)) cv2.imshow ('warpaffine'، warped) cv2.waitKey (0) cv2.destroyAllWindows ()
8. تطبيق Live Sketch
بادئ ذي بدء ، أهنئ نفسك على أنك قد أعددت هذا المشروع المصغر بعد قراءة جميع وظائف معالجة الصور أعلاه. لذلك في هذا المشروع المصغر لـ Python OpenCV سوف نتعلم بعض المفاهيم الجديدة للحلقات والوظائف. إذا كنت معتادًا على البرمجة ، فيجب أن يكون لديك فكرة أوسع عن ماهية الوظيفة والحلقات. ومع ذلك ، في بايثون ، يظل المفهوم الأساسي للحلقات والوظائف كما هو ولكن طريقة تحديدها تتغير قليلاً.
لذلك في بداية هذا البرنامج يمكننا أن نرى مجموعة معينة من العبارات تحت عنوان " رسم تخطيطي (صورة): " هذا تعريف رسمي لوظيفة مجموعة من العبارات تعمل معًا من أجل ناتج معين.
إذن هذا الرسم هو دالة ، في دالة Python يتم تعريفها بواسطة "def" وتنتهي بعلامة ":". كما أن العبارات التي يجب أن تكون داخل الوظيفة أو يمكنك تحديد ما هي مطلوبة حتى تعمل الوظيفة بشكل صحيح ، تتم محاذاة جنبًا إلى جنب تلقائيًا بواسطة الوظيفة. لذلك للخروج من الوظائف ، يجب أن تكون البيانات محاذاة تمامًا. لمزيد من المراجع ، يمكنك الرجوع إلى google حول كيفية تعريف الوظائف في Python.
لذلك في وظيفة الرسم هذه ، قمنا بإدخال عدة طبقات من معالجة الصور التي تتحد معًا لإعطاء مخرجات. أولاً ، يتم تحويل الصورة إلى درجات رمادية بحيث يمكن لـ opencv معالجتها بسهولة ثم يتم تطبيق تمويه Gaussian على الصورة ذات المقياس الرمادي لتقليل الضوضاء. ثم يتم استخراج الحواف بمساعدة خوارزمية الكشف عن الحواف ، ثم يتم تطبيق معكوس ثنائي على الصورة المحددة بالحافة ، وهنا يمكن أيضًا عمل معكوس ثنائي بواسطة bitwise_NOT لكننا اخترنا عمدًا عكسيًا ثنائيًا لأنه يمنح الحرية لتحديد معالمها حتى نحصل على صورة واضحة.
لاحظ أيضًا أن الوظيفة تأخذ صورة الوسائط وتعيد الوسيطتين ret and mask. في حين أن ret هو Boolean الذي يخبرنا أن الوظيفة يتم تشغيلها بنجاح أم لا وأن القناع هو الإخراج النهائي للوظيفة ، أي الصورة المعالجة.
ثم المفهوم الثاني هو تشغيل كاميرا الويب في opencv الذي يتم بواسطة وظيفة cv2.VideoCapture (0) ، التي تخزن الصورة في غطاء كائن يمكن قراءة الغطاء مع وظيفة cap.read () ، هنا أيضًا لملاحظة هذا الغطاء. read () داخل الحلقة اللانهائية حيث كان يتعين عليها باستمرار التقاط الصور ، لإعطائها إحساسًا بالفيديو المباشر ، حيث يكون معدل الإطارات للفيديو هو معدل الإطارات لكاميرا الويب الخاصة بك والتي تتراوح في الغالب بين 24 إلى 60 fps.
يعرض cap.read () ret والإطار ، حيث يكون ret هو Boolean يشير إلى أن الوظيفة تم تشغيلها بنجاح أم لا وأن الإطار يحتوي على الصورة الملتقطة بواسطة كاميرا الويب.
يوجد أدناه رمز Python OpenCV الكامل لتشغيل Live Sketch
استيراد cv2 استيراد numpy كـ np #sketch إنشاء رسم تخطيطي لوظيفة توليد (صورة): # تحويل الصورة إلى تدرج رمادي img_gray = cv2.cvtColor (صورة ، cv2.COLOR_BGR2GRAY) # تنظيف الصورة باستخدام التمويه الغاوسي img_gray_blur = cv2.GaussianBlur (img_gray_blur = cv2.GaussianBlur (img 5،5)، 0) #extract edges canny_edges = cv2.Canny (img_gray_blur، 10،70) # قم برمز ثنائي معكوس لتراجع الصورة ، القناع = cv2.threshold (canny_edges، 70،255، cv2.THRESH_BINARY_INV) عودة القناع #initialize كاميرا الويب ، cap هو الكائن الذي تم توفيره بواسطة التقاط الفيديو #it يحتوي على قيمة منطقية تشير إلى ما إذا كان ناجحًا (ret) #it تحتوي أيضًا على الصور التي تم جمعها من غطاء كاميرا الويب (الإطار) = cv2.VideoCapture (0) بينما True: ret، frame = cap.read () cv2.imshow ('lifketcher'، sketch (frame)) إذا cv2.waitKey (1) == 13: # 13 هو كسر مفتاح الدخول # إطلاق الكاميرا وإغلاق النافذة ، تذكر تحرير كاميرا الويب بمساعدة cap.release () cap.release () cv2.destroyAllWindows ()
هذه هي نهاية الجزء الثاني من معالجة الصور في Python-OpenCV. للحصول على فهم جيد لرؤية الكمبيوتر و OpenCV ، راجع المقالات السابقة (الشروع في استخدام Python OpenCV ومعالجات الصور في Python OpenCV (الجزء 1) وستكون قادرًا على صنع شيء رائع باستخدام رؤية الكمبيوتر.