قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  تشغيل/ التعرف على محيط الجسم في الوقت الحقيقي. رؤية الكمبيوتر على OpenCV

التعرف على محيط الجسم في الوقت الحقيقي. رؤية الكمبيوتر على OpenCV

يفجيني بوريسوف الاثنين 24 يوليو 2017

تقدم هذه المقالة نظرة عامة على طرق البحث عن كائن في صورة.

1 المقدمة

ترتبط العديد من المهام العملية من أتمتة التحكم في الإنتاج إلى تصميم المركبات الآلية ارتباطًا مباشرًا بمهمة العثور على الأشياء في الصورة. لحلها ، يمكنك استخدام استراتيجيتين مختلفتين ، تعتمدان على ظروف التصوير - نمذجة الخلفية ونمذجة الكائن.
  1. محاكاة الخلفية - يمكن استخدام هذا الأسلوب إذا كانت الكاميرا ثابتة ، أي لدينا خلفية لا تتغير إلا قليلاً ، وبالتالي يمكننا بناء نموذج لها. تعتبر جميع نقاط الصورة التي تنحرف بشكل كبير عن نموذج الخلفية كائنات في المقدمة. وبالتالي ، من الممكن حل مشاكل الكشف عن الأشياء وتعقبها.
  2. نمذجة الكائن - هذا النهج أكثر عمومية ، يتم استخدامه في الحالات التي تتغير فيها الخلفية باستمرار وبشكل ملحوظ. على عكس الحالة السابقة ، نحتاج هنا إلى معرفة ما نريد العثور عليه بالضبط ، أي من الضروري بناء نموذج للكائن ، ثم تحقق من نقاط الصورة للتوافق مع هذا النموذج.
في بعض الأحيان تسمح لك ظروف المشكلة بدمج كلا النهجين ، وهذا يمكن أن يحسن النتائج بشكل كبير. يمكن العثور على حل لمشكلة تصميم الخلفية لكاميرا ثابتة بتنسيق. بعد ذلك ، سننظر في تطبيق الاستراتيجية الثانية ، أي نمذجة كائن البحث.

2. نظرة عامة على الأساليب

في هذا القسم ، نقدم قائمة بالطرق التي يمكن استخدامها لحل مشكلة العثور على كائن في صورة بنجاح ، بترتيب زيادة التعقيد.
  1. مرشحات الألوان - إذا كان الكائن بارزًا بشكل ملحوظ عن الخلفية بالألوان ، فيمكنك اختيار المرشح المناسب.
  2. تحديد المعالم وتحليلها - إذا علمنا أن الكائن له شكل دائرة ، على سبيل المثال ، فيمكننا البحث عن الدوائر في الصورة.
  3. مطابقة النمط - لدينا صورة لكائن ما ، نبحث عن مناطق في صورة أخرى تتطابق مع صورة كائن ما.
  4. العمل مع نقاط خاصة - في الصورة مع الكائن ، نبحث عن ميزات (على سبيل المثال ، الزوايا) ، والتي نحاول مقارنتها بمثل هذه الميزات في صورة أخرى.
  5. طرق التعلم الآلي - نقوم بتدريب المصنف على الصور مع كائن ، بطريقة ما نقسم الصورة إلى أجزاء ، ونتحقق من كل جزء باستخدام المصنف بحثًا عن وجود كائن.
سنلقي نظرة على هذه الأساليب بمزيد من التفصيل أدناه.

3. مرشحات الألوان

يمكن استخدام طريقة مرشحات الألوان في الحالات التي يختلف فيها الكائن بشكل كبير عن الخلفية في اللون وتكون الإضاءة موحدة ولا تتغير. يمكنك قراءة المزيد عن طريقة مرشح الألوان بتنسيق.

4. استخراج وتحليل ملامح

إذا كان الكائن لا يبرز بشكل ملحوظ على الخلفية في اللون و / أو له ألوان معقدة ، فإن استخدام طريقة مرشحات الألوان لن يعطي نتائج جيدة. في هذه الحالة ، يمكنك محاولة تطبيق طريقة اختيار وتحليل الملامح. للقيام بذلك ، نختار الحدود في الصورة. الحدود هي الأماكن التي يتغير فيها تدرج السطوع فجأة ويمكن العثور عليها باستخدام طريقة Canny. بعد ذلك ، يمكننا التحقق من خطوط الحدود المحددة للتوافق مع الخطوط الهندسية للكائن ، ويمكن القيام بذلك باستخدام طريقة Hough Transform ، على سبيل المثال ، يمكننا البحث داخل حدود الدائرة.





الشكل 4:إيجاد الدوائر

يمكن استخدام هذه الطريقة أيضًا مع مرشحات الألوان. يمكنك قراءة المزيد حول اختيار وتحليل الملامح في. يمكن تنزيل الكود المصدري لمثال بحث الدائرة.

5. مطابقة النمط

إذا كانت الصورة تحتوي على الكثير من التفاصيل الصغيرة ، فقد يكون تحليل الحافة أمرًا صعبًا. في هذه الحالة ، يمكنك استخدام طريقة مطابقة القالب. يتكون مما يلي - نلتقط صورة مع كائن (الشكل 5) ونبحث عن مناطق في الصورة الكبيرة التي تتوافق مع صورة الكائن (الشكل 6،7).


الشكل 5:كائن للبحث

يمكنك الاستماع إلى المحاضرة بمزيد من التفاصيل حول طريقة مطابقة النمط. يمكن تنزيل الكود المصدري للمثال.

6. العمل مع النقاط الخاصة

تبحث طريقة مطابقة النمط الموضحة في القسم السابق عن التطابقات الدقيقة بين نقاط النمط ونقاط الصورة. إذا تم تدوير الصورة أو تحجيمها بالنسبة لمعلمات القالب ، فإن هذه الطريقة لا تعمل بشكل جيد. للتغلب على هذه القيود ، تعتمد الأساليب على ما يسمى ب. نقاط فردية ، سننظر فيها أدناه. النقطة الأساسية هي منطقة صغيرة تبرز بشكل ملحوظ في الصورة. هناك عدة طرق لتحديد هذه النقاط ، يمكن أن تكون زوايا (كاشف زاوية هاريس) أو نقاط (نقطة ، قطرة) ، أي مساحات صغيرة من نفس السطوع ، بحد واضح إلى حد ما يبرز في الخلفية العامة. للحصول على نقطة خاصة ، ما يسمى ب. واصف - خاصية نقطة معينة. يتم حساب الواصف من حي معين للنقطة المفردة ، مثل اتجاهات تدرجات السطوع لأجزاء مختلفة من هذا الحي. هناك عدة طرق لحساب واصفات النقاط الخاصة: SIFT ، SURF ، ORB ، إلخ. وتجدر الإشارة إلى أن بعض طرق حساب الواصفات مسجلة ببراءة اختراع (على سبيل المثال ، SIFT) واستخدامها التجاري محدود. يمكنك الاستماع إلى المحاضرة بمزيد من التفصيل حول النقاط الخاصة بالصور وطرق التعامل معها. يمكن استخدام النقاط الخاصة للعثور على كائن في الصورة. للقيام بذلك ، نحتاج إلى صورة للكائن المطلوب ثم تنفيذ الإجراءات التالية.
  1. في الصورة مع الكائن ، نبحث عن نقاط خاصة للكائن ونحسب واصفاتها.
  2. في الصورة التي تم تحليلها ، نبحث أيضًا عن نقاط مفردة ونحسب الواصفات لها.
  3. نحن نقارن واصفات النقاط الخاصة للكائن واصفات النقاط الخاصة الموجودة في الصورة.
  4. إذا تم العثور على عدد كافٍ من التطابقات ، فسنحدد المنطقة بالنقاط المقابلة.
يوضح الشكل 8 أدناه نتائج طريقة البحث عن كائن بنقاط مفردة.


الشكل 8:كاشف عن طريق نقاط خاصة

يمكن تنزيل الكود المصدري للمثال.

7. طرق التعلم الآلي

إن طريقة البحث عن الأشياء من خلال مقارنة مجموعات النقاط الخاصة لها عيوبها ، أحدها ضعف القدرة على التعميم. إذا كانت لدينا مهمة ، على سبيل المثال ، لتحديد وجوه الأشخاص في صورة ما ، فإن طريقتنا ستبحث عن صورة واحدة محددة في نقاط خاصة. الصورة التي تم فيها تحديد النقاط الخاصة ، ستظهر بقية الوجوه بشكل أسوأ ، لأنها ، على الأرجح ، تتوافق مع مجموعات أخرى من النقاط الخاصة. يمكن أن تكون النتائج أسوأ إذا قمت بتغيير زاوية الكاميرا. لحل هذه المشكلات ، نحتاج بالفعل إلى طرق التعلم الآلي وليس صورة واحدة مع كائن ، ولكن مجموعات تدريب كاملة من المئات (وفي بعض الحالات ، مئات الآلاف) من الصور المختلفة مع صورة كائن في ظروف مختلفة. سننظر في تطبيق أساليب التعلم الآلي للعثور على كائنات في صورة في الجزء الثاني من هذه المقالة.

المؤلفات

  1. كاشف الأجسام ES Borisov للكاميرات الثابتة.
    - http: //site/cv-backgr.html
  2. معالجة الفيديو ES Borisov: كاشف الكائن على أساس مرشحات الألوان.
    - http: //site/cv-detector-color.html
  3. ES Borisov الطرق الأساسية لمعالجة الصور.
    - http: //site/cv-base.html
  4. انطون كونوشين رؤية الكمبيوتر (2011). المحاضرة 3. طرق بسيطة لتحليل الصور. أنماط المطابقة.
    - http://www.youtube.com/watch؟v=TE99wDbRrUI
  5. توثيق OpenCV: كشف ركن هاريس
    - http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html
  6. ويكيبيديا: Blob_detection
    - http://en.wikipedia.org/wiki/Blob_detection
  7. انطون كونوشين رؤية الكمبيوتر (2011). المحاضرة 5. الميزات المحلية
    - http://www.youtube.com/watch؟v=vFseUICis-s

مكتبة مفتوحة المصدر للرؤية الحاسوبية والتعلم الآلي. يتضمن أكثر من 2500 خوارزمية ، والتي تشمل كلا من الخوارزميات الكلاسيكية والحديثة لرؤية الكمبيوتر والتعلم الآلي. تحتوي هذه المكتبة على واجهات بلغات مختلفة ، من بينها Python (نستخدمها في هذه المقالة) و Java و C ++ و Matlab.

التركيب

يمكن الاطلاع على تعليمات التثبيت لنظام التشغيل Windows ، و Linux -.

استيراد وعرض صورة

import cv2 image = cv2.imread ("./ path / to / image.extension") cv2.imshow ("Image"، image) cv2.waitKey (0) cv2.destroyAllWindows ()

ملاحظة عند قراءة الطريقة أعلاه ، تكون الصورة في مساحة اللون ليست RGB (كما اعتاد الجميع) ، ولكن BGR. قد لا يكون الأمر بهذه الأهمية في البداية ، ولكن بمجرد بدء العمل بالألوان ، من المفيد معرفة هذه الميزة. يوجد حلان:

  1. بدل القناة الأولى (R - أحمر) بالقناة الثالثة (B - أزرق) ، ثم اللون الأحمر سيكون (0،0،255) وليس (255،0،0).
  2. تغيير مساحة اللون إلى RGB: rgb_image = cv2.cvtColor (صورة ، cv2.COLOR_BGR2RGB)

    ثم في الكود لم يعد يعمل مع الصورة ، ولكن مع rgb_image.

ملاحظة اضغط على أي مفتاح لإغلاق النافذة التي يتم عرض الصورة فيها. إذا كنت تستخدم زر إغلاق النافذة ، فقد تتعثر في حالة التجمد.

في جميع أنحاء المقال ، سيتم استخدام الكود التالي لعرض الصور:

استيراد cv2 def viewImage (صورة ، name_of_window): cv2.itledWindow (name_of_window، cv2.WINDOW_NORMAL) cv2.imshow (name_of_window، image) cv2.waitKey (0) cv2.destroyAllWindows ()

اقتصاص

الكلب بعد الاقتصاص

استيراد cv2 cropped = image viewImage (اقتصاص ، "Doggie بعد الاقتصاص")

أين الصورة هي الصورة.

تغيير الحجم

بعد تغيير الحجم بنسبة 20٪

استيراد cv2 scale_percent = 20 # النسبة المئوية لعرض الحجم الأصلي = int (img.shape * scale_percent / 100) height = int (img.shape * scale_percent / 100) dim = (width، height) resize = cv2.resize (img، dim ، الإقحام = cv2.INTER_AREA) عرض الصورة (تم تغيير حجمها ، "بعد تغيير الحجم بنسبة 20٪")

تأخذ هذه الوظيفة في الاعتبار نسبة العرض إلى الارتفاع للصورة الأصلية. يمكن رؤية وظائف أخرى لتغيير حجم الصورة.

منعطف أو دور

الكلب بعد أن تحول 180 درجة

استيراد cv2 (h، w، d) = image.shape center = (w // 2، h // 2) M = cv2.getRotationMatrix2D (center، 180، 1.0) rotated = cv2.warpAffine (image، M، (w ، h)) viewImage (مستدير ، "Doggie بعد دوران 180 درجة")

إرجاع image.shape الطول والعرض والقنوات. M - مصفوفة الدوران - تقوم بتدوير الصورة 180 درجة حول المركز. -ve هو دوران الصورة في اتجاه عقارب الساعة ، و + ve عكس اتجاه عقارب الساعة ، على التوالي.

عتبة درجات الرمادي والأبيض والأسود

الكلب الرمادي

كلب أبيض وأسود

استيراد cv2 gray_image = cv2.cvtColor (صورة ، cv2.COLOR_BGR2GRAY) ret، threshold_image = cv2.threshold (im، 127، 255، 0) viewImage (gray_image، "Grayscale doggie") viewImage (threshold_image، ") doggie بالأبيض والأسود

grey_image هي نسخة أحادية القناة من الصورة.

تُرجع وظيفة العتبة صورة يتم فيها استبدال كل وحدات البكسل الأغمق (أقل من) 127 بـ 0 ، ويتم استبدال كل وحدات البكسل الأكثر سطوعًا (أكبر من) 127 بـ 255.

من أجل الوضوح ، مثال آخر:

Ret ، عتبة = cv2.threshold (im ، 150 ، 200 ، 10)

هنا يتم استبدال كل شيء أغمق من 150 بـ 10 ، وكل ما هو أكثر إشراقًا يتم استبداله بـ 200.

تم وصف باقي وظائف العتبة.

طمس / تنعيم

ضبابية الكلب

استيراد cv2 blurred = cv2.GaussianBlur (image، (51، 51)، 0) viewImage (blurred، "blurred doggie")

تأخذ وظيفة GaussianBlur 3 معلمات:

  1. الصورة الأصلية.
  2. مجموعة مكونة من 2 عدد فردي موجب. كلما زادت الأرقام ، زادت قوة التجانس.
  3. سيجماكسو سيغماي... إذا تُركت هذه المعلمات مساوية لـ 0 ، فسيتم حساب قيمتها تلقائيًا.

رسم المستطيلات

ارسم مستطيلاً حول وجه الكلب

استيراد إخراج cv2 = image.copy () cv2.rectangle (إخراج ، (2600 ، 800) ، (4100 ، 2400) ، (0 ، 255 ، 255) ، 10) viewImage (الإخراج ، "رسم مستطيل حول وجه الكلب" )

تأخذ هذه الوظيفة 5 معلمات:

  1. الصورة نفسها.
  2. إحداثيات الزاوية العلوية اليسرى (x1 ، y1).
  3. إحداثيات الزاوية اليمنى السفلية (x2 ، y2).
  4. لون المستطيل (GBR / RGB حسب نموذج اللون المحدد).
  5. عرض خط المستطيل.

خط الرسم

2 كلاب مفصولة بخط

استيراد إخراج cv2 = image.copy () cv2.line (الإخراج ، (60 ، 20) ، (400 ، 200) ، (0 ، 0 ، 255) ، 5) viewImage (الإخراج ، "كلاب مفصولة بخط")

تأخذ وظيفة الخط 5 معلمات:

  1. الصورة الفعلية التي يرسم عليها الخط.
  2. إحداثيات النقطة الأولى (x1، y1).
  3. إحداثيات النقطة الثانية (x2، y2).
  4. لون الخط (GBR / RGB حسب نموذج اللون المحدد).
  5. عرض الخط.

نص على الصورة

صورة مع نص

استيراد إخراج cv2 = image.copy () cv2.putText (إخراج ، "نحن<3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "Изображение с текстом")

تأخذ وظيفة putText 7 معلمات:

  1. صورة مباشرة.
  2. نص للصورة.
  3. تنسيق الزاوية اليسرى السفلية لبداية النص (س ، ص).
  4. تم اكتشاف الوجوه: 2

    استيراد cv2 image_path = "./path/to/photo.extension" face_cascade = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml") image = cv2.imread (image_path) gray = cv2.cvtColor (image، cv2.COLOR_BGR_BectMulti) ، scaleFactor = 1.1، minNeighbours = 5، minSize = (10، 10)) faces_detected = "تم اكتشاف الوجوه:" + تنسيق (len (وجوه)) طباعة (تم اكتشاف الوجوه) # ارسم مربعات حول الوجوه لـ (x ، y ، w ، h ) في الوجوه: cv2.rectangle (image، (x، y)، (x + w، y + h)، (255، 255، 0)، 2) viewImage (image، faces_detected)

    DiscoverMultiScale هي وظيفة عامة للتعرف على الوجوه والأشياء. لكي تقوم الوظيفة بالبحث على وجه التحديد عن الوجوه ، نقوم بتمريرها بالتتالي المناسب.

    تأخذ وظيفة DiscoverMultiScale 4 معلمات:

    1. الصورة المعالجة بتدرج الرمادي.
    2. معلمة ScaleFactor. قد تكون بعض الوجوه أكبر من غيرها لأنها أقرب من غيرها. هذه المعلمة تعوض المنظور.
    3. تستخدم خوارزمية التعرف نافذة منزلقة أثناء التعرف على الكائن. تحدد معلمة minNeighbours عدد الكائنات حول الوجه. أي أنه كلما زادت قيمة هذه المعلمة ، كلما كانت الكائنات الأكثر تشابهًا التي تحتاجها الخوارزمية لتحديد الكائن الحالي كوجه. ستؤدي القيمة الصغيرة جدًا إلى زيادة عدد الإيجابيات الخاطئة ، وستزيد القيمة الكبيرة جدًا من الخوارزمية.
    4. minSize هو الحجم الفعلي لهذه المناطق.

    ملامح - التعرف على الأشياء

    يتم إجراء التعرف على الكائن باستخدام تجزئة اللون للصورة. هناك وظيفتان لهذا: cv2.findContours و cv2.drawContours.

    تفاصيل هذه المقالة الكشف عن الكائن باستخدام تجزئة اللون. كل ما تحتاجه لها موجود.

    حفظ الصورة

    import cv2 image = cv2.imread ("./ import / path.extension") cv2.imwrite ("./ export / path.extension"، image)

    استنتاج

    OpenCV عبارة عن مكتبة ممتازة ذات خوارزميات خفيفة الوزن يمكن استخدامها في العرض ثلاثي الأبعاد ، وتحرير الصور والفيديو المتقدم ، وتتبع وتحديد الكائنات والأشخاص في مقاطع الفيديو ، والعثور على صور متطابقة من مجموعة ، وأكثر من ذلك بكثير.

    هذه المكتبة مهمة جدًا لأي شخص يقوم بتطوير المشاريع المتعلقة بالتعلم الآلي في مجال الصور.

ستوضح لك هذه المقالة كيفية إنشاء برنامج نصي بلغة Python لحساب عدد الكتب في صورة ما باستخدام OpenCV.

ماذا سنفعل؟

دعنا نلقي نظرة على الصورة التي سنبحث فيها عن الكتب:

يمكننا أن نرى أن هناك أربعة كتب في الصورة ، بالإضافة إلى عناصر تشتت الانتباه مثل كوب قهوة ، وكوب ستاربكس ، وبعض المغناطيسات ، وقطعة حلوى.

هدفنا هو العثور على الكتب الأربعة في الصورة دون تحديد أي عنصر آخر ككتاب.

ما المكتبات التي نحتاجها؟

لكتابة نظام للبحث عن الكتب على الصور واكتشافها ، سنستخدم OpenCV لرؤية الكمبيوتر ومعالجة الصور. نحتاج أيضًا إلى تثبيت NumPy لـ OpenCV للعمل بشكل صحيح. تأكد من تثبيت هذه المكتبات!

البحث عن كتب عن الصور باستخدام Python و OpenCV

تقريبا. ترجمة. قد تلاحظ أن الكود المصدري في مقالتنا يختلف عن الكود الأصلي. ربما استخدم المؤلف تثبيت المكتبات المطلوبة من خلال المستودعات. نقترح استخدام النقطة ، وهو أسهل بكثير. لتجنب الأخطاء ، نوصي باستخدام إصدار الكود الوارد في مقالتنا.

افتح محرر الكود المفضل لديك ، وأنشئ ملفًا جديدًا يسمى find_books.py وابدأ:

# - * - الترميز: utf-8 - * - # استيراد الحزم المطلوبة استيراد numpy مثل np import cv2 # تحميل الصورة ، وتغيير اللون إلى تدرج الرمادي وإلغاء وضوح الصورة = cv2.imread ("example.jpg") رمادي = cv2. cvtColor (صورة ، cv2.COLOR_BGR2GRAY) رمادي = cv2.GaussianBlur (رمادي ، (3 ، 3) ، 0) cv2.imwrite ("gray.jpg" ، رمادي)

لنبدأ باستيراد مكتبة OpenCV. يتم معالجة تحميل صورة من القرص بواسطة وظيفة cv2.imread. هنا نقوم فقط بتحميله من القرص ثم نقوم بتحويل التدرج اللوني من RGB إلى التدرج الرمادي.

نقوم أيضًا بتشويه الصورة قليلاً لتقليل الضوضاء عالية التردد وتحسين دقة تطبيقنا. بعد تنفيذ الكود ، يجب أن تبدو الصورة كما يلي:

قمنا بتحميل صورة من القرص ، وحولناها إلى تدرج رمادي وقمنا بتشويشها قليلاً.

الآن دعنا نحدد حواف الكائنات في الصورة (أي الخطوط العريضة):

# حافة كشف الحافة = cv2.Canny (رمادي ، 10 ، 250) cv2.imwrite ("edged.jpg" ، ذو حواف)

تبدو صورتنا الآن كما يلي:

وجدنا الخطوط العريضة للكائنات في الصور. ومع ذلك ، كما ترى ، فإن بعض المسارات ليست مغلقة - توجد فجوات بين المسارات. لإزالة الفجوات بين وحدات البكسل البيضاء في الصورة ، سنستخدم عملية "الإغلاق":

# إنشاء وتطبيق kernel = cv2.getStructuringElement (cv2.MORPH_RECT، (7، 7)) مغلق = cv2.morphologyEx (edged، cv2.MORPH_CLOSE، kernel) cv2.imwrite ("closed.jpg" ، مغلق)

الآن تم إغلاق الفجوات في الخطوط العريضة:

الخطوة التالية هي اكتشاف الخطوط العريضة للكائنات في الصورة. لهذا سوف نستخدم cv2.findContours وظيفة:

# ابحث عن الخطوط العريضة في الصورة وعد عدد الكتب.

تأمل هندسة الكتاب.

الكتاب مستطيل. للمستطيل أربعة رؤوس. لذلك ، إذا نظرنا إلى المخطط ووجدنا أنه يحتوي على أربعة رؤوس ، فيمكننا أن نفترض أن هذا كتاب وليس كائنًا آخر في الصورة.

للتحقق مما إذا كان المسار كتابًا أم لا ، نحتاج إلى المرور عبر كل مسار:

# حلقة على طول خطوط c في cnts: # تقريبي (سلس) محيط محيط = cv2.arcLength (c ، True) تقريبًا = cv2.approxPolyDP (c، 0.02 * peri، True) # إذا كان الكفاف يحتوي على 4 رؤوس ، فإننا افترض أنه كتاب إذا كان len (تقريبًا) == 4: cv2.drawContours (صورة ، -1 ، (0 ، 255 ، 0) ، 4) إجمالي + = 1

لكل مسار من المسارات ، نحسب المحيط باستخدام cv2.arcLength ثم نقرب (سلس) المسار باستخدام cv2.approxPolyDP.

السبب في تقريبنا للمسار هو أنه قد لا يكون مستطيلاً كاملاً. نظرًا للضوضاء والظلال في الصورة ، فمن غير المرجح أن يحتوي الكتاب على 4 رؤوس بالضبط. بتقريب الكفاف ، نحل هذه المشكلة.

أخيرًا ، نتحقق من أن الكفاف المطلوب تقريبه له بالفعل أربعة رؤوس. إذا كان الأمر كذلك ، فسنرسم مخططًا حول الكتاب ثم نزيد العداد لإجمالي عدد الكتب.

دعونا نختتم هذا المثال من خلال إظهار الصورة الناتجة وعدد الكتب التي تم العثور عليها:

# اعرض الصورة المطبوعة الناتجة ("لقد وجدت (0) كتب في هذه الصورة". تنسيق (إجمالي) cv2.imwrite ("output.jpg" ، صورة))

في هذه المرحلة ، ستبدو صورتنا كما يلي:

دعونا نلخص

في هذه المقالة ، تعلمت كيفية العثور على الكتب في الصور باستخدام تقنيات معالجة الصور البسيطة ورؤية الكمبيوتر باستخدام Python و OpenCV.

كان نهجنا هو:

  1. قم بتحميل صورة من القرص وقم بتحويلها إلى تدرج الرمادي.
  2. طمس الصورة قليلاً.
  3. تطبيق كاشف الحافة Canny للكشف عن الكائنات في الصورة.
  4. قم بإغلاق أي فجوات في المسارات.
  5. ابحث عن الخطوط العريضة للكائنات في الصورة.
  6. قم بتطبيق تقريب الكنتور لتحديد ما إذا كان الكفاف مستطيلًا وبالتالي كتابًا.

يمكنك تنزيل الكود المصدري للبرنامج النصي والصورة المستخدمة في هذه المقالة.

الفكرة الرئيسية هي مراعاة العلاقات الإحصائية بين موقع النقاط البشرية للوجه. في كل صورة وجه ، يتم ترقيم النقاط بنفس الترتيب. تتم مقارنة الوجوه حسب موقعها النسبي.

لمقارنة الوجوه ، يمكنك استخدام نفس موضع الوجه بالنسبة للكاميرا. أكثر الأفضل لهذا.

التقاط دفق فيديو من الكاميرا وإبراز الوجه

#يشمل باستخدام مساحة الاسم السيرة الذاتية ؛ int main () (// تحميل تتالي الوجه (ملف .xml) CascadeClassifier face_cascade؛ face_cascade.load ("haarcascade_frontalface_alt2.xml")؛ Mat img؛ VideoCapture cap (0)؛ while (true) (cap >> img؛ // cvtColor (img ، img ، CV_BGR2GRAY) ؛ // كشف الوجوه الأمراض المنقولة جنسيا :: المتجهات الوجوه. face_cascade.detectMultiScale (img، faces، 1.1، 2، 0 | CV_HAAR_SCALE_IMAGE، Size (30، 30)) ؛ // ارسم دوائر على الوجوه المكتشفة لـ (int i = 0 ؛ i< faces.size(); i++) { Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); ellipse(img, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); } imshow("Detected Face", img); waitKey(1); } return 0; }

توجد الملفات المتتالية في الدليل c: \ opencv \ build \ etc \ ... ضع التتالي المطلوب في دليل المشروع ، في نفس المكان مثل الملف المصدر main.cpp.

إبراز نقاط الوجه

يعتمد التطبيق على كود C ++ الخاص بـ OpenCV Facemark

#يشمل #يشمل #يشمل #يشمل #يشمل #يشمل # تضمين "drawLandmarks.hpp" باستخدام مساحة الاسم std؛ باستخدام مساحة الاسم السيرة الذاتية ؛ باستخدام مساحة الاسم السيرة الذاتية :: الوجه ؛ int main (int argc، char ** argv) (// تحميل كاشف الوجه CascadeClassifier faceDetector ("haarcascade_frontalface_alt2.xml") ؛ // إنشاء مثيل من Facemark Ptr facemark = FacemarkLBF :: create () ، // تحميل أداة الكشف عن المعالم-> loadModel ("lbfmodel.yaml") ؛ // إعداد كاميرا الويب لالتقاط الفيديو VideoCapture cam (0) ؛ // متغير لتخزين إطار الفيديو وإطار مات التدرج الرمادي الخاص به ، رمادي ؛ // اقرأ إطارًا أثناء (قراءة الكاميرا (إطار)) (// ابحث عن متجه الوجه الوجوه. // تحويل الإطار إلى تدرج رمادي لأن // faceDetector يتطلب صورة ذات تدرج رمادي. cvtColor (إطار ، رمادي ، COLOR_BGR2GRAY) ؛ // كشف الوجوه faceDetector.detectMultiScale (الرمادي ، الوجوه) ؛ // متغير للمعالم. // معالم وجه واحد هي متجه من النقاط // يمكن أن يكون هناك أكثر من وجه واحد في الصورة. ومن ثم ، فإننا نستخدم / / متجهًا من متجه النقاط. المتجه< vector> المعالم ؛ // تشغيل مستكشف المعالم bool Success = facemark->< faces.size(); i++) { cv::rectangle(frame, faces[i], Scalar(0, 255, 0), 3); } for (int i = 0; i < landmarks.size(); i++) { drawLandmarks(frame, landmarks[i]); /*for (size_t j = 0; j < landmarks[i].size(); j++) circle(frame, Point(landmarks[i][j].x, landmarks[i][j].y), 1, Scalar(255, 0, 0), 2);*/ } } // Display results imshow("Facial Landmark Detection", frame); // Exit loop if ESC is pressed if (waitKey(1) == 27) break; } return 0; }

في مشروع التطبيق ، في نفس مكان الملف main.cpp ،ملفات نشرها haarcascade_frontalface_alt2.xml, drawLandmarks.hppو lbfmodel.yamlالمشار إليها في الكود. توجد الملفات المتتالية في الدليل c: \ opencv \ build \ etc \ .... drawLandmarks.hppو lbfmodel.yamlمتاح في أرشيف Facemark_LBF.rar.

بعد لصق الكود ، ظهرت أخطاء بسبب حقيقة أن OpenCV 3.4.3-vc14-vc15 يفتقر إلى عدد من المكتبات المطلوبة لتشغيل التطبيق. لقد ربطت مكتبتي (قم بتنزيل opencv_new.zip) وقمت بتثبيتها في جذر محرك الأقراص C (C: \ opencv-new).

الآن ، يجب إجراء جميع الإعدادات التي تم إجراؤها لـ opencv-new:

ضبط الإعدادات في Windows... أذهب إلى نافذة "تغيير متغير البيئة" (أزرار Windows -> أدوات النظام -> لوحة التحكم -> النظام والأمان -> النظام -> إعدادات النظام المتقدمة -> متغيرات البيئة -> المسار -> تغيير). في هذه النافذة أقوم بإنشاء المتغير C: \ opencv جديد\ x64 \ vc14 \ بن. أعد تشغيل Windows.

في خصائص المشروعراجع أيضًا مكتبة opencv_new (بدلاً من opencv). في نافذة "صفحات الخصائص" ، أفعل ما يلي:

  • C / C ++ -> عام -> أدلة تضمين إضافية -> C: \ opencv جديد\ يشمل
  • رابط -> عام -> أدلة مكتبة إضافية -> C: \ opencv جديد\ x64 \ vc14 \ ليب
  • الرابط -> الإدخال -> التبعيات الإضافية -> opencv_core400.lib ؛ opencv_face400.lib ؛ opencv_videoio400.lib ؛ opencv_objdetect400.lib ؛ opencv_imgproc400.lib ؛ opencv_highgui400.lib

عند بدء التشغيل ، يقوم البرنامج بإنشاء خطأ إذا كان Debug. للإصدار ، تم الإطلاق بنجاح.


تحديد ميزات لتصفية الصور والتعرف على الوجوه

يتم عرض الإطار المنقط للوجه بطرق مختلفة اعتمادًا على العوامل الموضوعية والذاتية.

العوامل الموضوعية هي موضع الوجه بالنسبة للكاميرا.

العوامل الذاتية - الإضاءة غير المتكافئة أو السيئة ، تشوه الوجه بسبب العواطف ، عيون تحدق ، إلخ. في هذه الحالات ، قد لا يكون الإطار السلكي صحيحًا ، بل قد يتمزق النقاط من الوجه:

في بعض الأحيان يتم تخطي هذه الصور أثناء التقاط الفيديو. يجب تصفيتهم - سواء أثناء التدريب أو الاعتراف.

بعض النقاط هي الأكثر استقرارًا وإفادة. يتم تثبيتها بشكل صارم على الوجه ، بغض النظر عن موضعها بالنسبة للكاميرا. بالإضافة إلى ذلك ، فهي تميز بشكل جيد خصائص الوجه. يمكن استخدام هذه النقاط كأساس لنمذجة نظام الميزات.

يمكنك استخدام إطار سلكي نقطي ثنائي الأبعاد من نفس موضع الوجه لمقارنة الوجوه. ما هو الموقف الأكثر إفادة لوجهك بالنسبة للكاميرا؟ من الواضح أمامي. ليس من قبيل الصدفة أن يأخذ علم الطب الشرعي صورة كاملة للوجه وصورة للملف الشخصي. في الوقت الحالي ، سنقتصر على الوجه الكامل.

يجب أن تكون جميع العلامات (المسافات) بلا أبعاد (طبيعية) ، أي مرتبطة ببعض الحجم (المسافة). أعتقد أن الحجم الأنسب لهذا هو المسافة بين نقاط المنتصف لنقاط الزاوية للعيون. لماذا لا ، على سبيل المثال ، نقاط الزاوية الخارجية للعيون ، والتي تم تحديدها بالفعل في مجموعة المعالم؟ الحقيقة هي أن نقاط ركن العينين تبتعد عن بعضها (تقترب أكثر) عند الاستجابة لتغير اللون ، والتعبير عن المفاجأة ، والوميض ، وما إلى ذلك. المسافة بين مراكز العيون تحيد هذه التقلبات وبالتالي فهي أكثر تفضيلاً.

ما هي العلامة التي سنتخذها كأساس في التقريب الأول؟ أفترض المسافة من أعلى جسر الأنف إلى أسفل الذقن. اذا حكمنا من خلال الصورة ، قد تختلف هذه العلامة بشكل كبير بالنسبة للأشخاص المختلفين.

لذلك ، قبل تكوين ميزات للتدريب والمقارنة ، من الضروري تصفية إطارات النقاط للوجوه التي تم الحصول عليها من خلال التقاط الفيديو ، والتي ، لأسباب ذاتية أو موضوعية ، ليست الصورة الأمامية الصحيحة للوجه (الوجه الكامل).

نترك فقط الإطارات الشبكية النقطية التي تتبع المعايير التالية:

  • الخط المستقيم الذي يمر عبر النقاط القصوى للعينين (خط العين) عمودي على الخط الذي يمر عبر النقاط القصوى من الأنف (خط الأنف).
  • يكون خط العين موازٍ للخط المستقيم الذي يمر عبر زوايا الفم (خط الفم).
  • النقاط أعلاه متناظرة حول خط الأنف.
  • نقاط زاوية العينين (الخارجية والداخلية) على نفس الخط المستقيم.

مثال على الصور الأمامية التي تظهر جميع العلامات:

مثال على الصور التي تمت تصفيتها:

حاول أن تحدد بنفسك العلامات التي لا تعبر الصور.

كيف يتم إضفاء الطابع الرسمي على الميزات التي توفر التصفية والتعرف على الوجوه؟ تعتمد بشكل أساسي على شروط تحديد المسافات بين النقاط وشروط التوازي والعمود. تتم مناقشة مهمة إضفاء الطابع الرسمي على مثل هذه العلامات في الموضوع.

خوارزمية للتعرف على الوجوه بواسطة إطار سلكي ثنائي الأبعاد للنقاط

يتم ضبط إحداثيات نقاط الإطار السلكي للوجه مبدئيًا في نظام الإحداثيات ، والذي يتم تثبيته في النقطة اليسرى العلوية من النافذة. في هذه الحالة ، يتم توجيه المحور ص لأسفل.

لسهولة تحديد الميزات ، نستخدم نظام إحداثيات مخصص (UCS) ، حيث يمر محور X عبر المقطع بين نقاط المنتصف للعيون ، ويكون المحور Y متعامدًا على هذا الجزء من خلال منتصفه في الاتجاه التصاعدي. يتم تطبيع إحداثيات UCS (من -1 إلى +1) - مرتبطة بالمسافة بين نقاط المنتصف للعيون.

يوفر UCS الراحة والبساطة في تحديد الميزات. على سبيل المثال ، يتم تحديد موضع الوجه في المنظر الأمامي بعلامة تناظر النقاط المقابلة للعينين بالنسبة إلى خط الأنف. يتم إضفاء الطابع الرسمي على هذه الميزة من خلال تزامن خط الأنف مع المحور Y ، أي X1 = X2 = 0 ، حيث X1 و X2 هما إحداثيات النقاط القصوى للأنف (27 و 30) في UCS.

تحديد نسبة إلى النافذة SC

إحداثيات نقاط المنتصف للعينين اليمنى واليسرى (اليسار واليمين):

XL = (X45 + X42) / 2 ؛ YL = (Y45 + Y42) / 2 ؛ XR = (X39 + X 36) / 2 ؛ YR = (Y39 + Y 36) / 2 ؛

بداية UCS:

X0 = (XL + XR) / 2 ؛ Y0 = (YL + YR) / 2 ،

المسافات بين نقاط منتصف العين على طول المحورين X و Y:

DX = XR - XL ؛ DY = YR - YL ؛

المسافة الفعلية L بين نقطتي منتصف العينين (وفقًا لنظرية فيثاغورس):

L = الجذر التربيعي (DX ** 2 + DY ** 2)

الدوال المثلثية لزاوية دوران UCS:

انتقل من الإحداثيات في CS ذات النوافذ إلى الإحداثيات في UCSباستخدام المعلمات X0 و Y0 و L و sin AL و cos AL:

X_User_0 = 2 (X_Window - X0) / L ؛

Y_User_0 = - 2 (Y_Window - Y0) / L ؛

X_User= X_User_0 * cos_AL - Y_User_0 * sin_AL ؛

Y_ المستخدم= X_User_0 * sin_AL + Y_User_0 * cos_AL ؛

تنفيذ تصفية الصورفحص العلامات باستمرار:

1- علامة على عمودية خطوط الأنف والعينين وكذلك تناسق نقاط ركن العينين... يتم تحديد خط الأنف بالنقطتين 27 و 30 (انظر الشكل ج). تتحقق كلتا العلامتين إذا كانت إحداثيات هذه النقاط في UCS هي X1 = X2 = 0 (أي أن خط الأنف يتزامن مع المحور Y).

2- علامة على التوازي بين خط العينين وخط الفم... يتم تحديد خط الفم بالنقطتين 48 و 54 (انظر الشكل ج). تتحقق الخاصية إذا كان في UCS Y1-Y2 = 0.

3. علامة تناظر نقاط ركن الفم... يتم تحديد خط الفم بالنقطتين 48 و 54 (انظر الشكل ج). تتحقق هذه الميزة إذا كانت في UCS X1 + X2 = 0

4. قم بتسجيل "نقاط ركن العيون على نفس الخط المستقيم"... يتم تحديد الخطوط من خلال أزواج من النقاط: (36 و 45) ، وكذلك (39 و 42). نظرًا لأن اختبار السمة 1 قد تم اجتيازه بالفعل ، يكفي فقط تحديد السمة Y2-Y1 = 0 في UCS للنقطتين 36 و 39 فقط.

لا يمكن أن تكون هناك مساواة مطلقة للصفر ، لذلك تتم مقارنة الميزات بقيمة صغيرة معترف بها.

برنامج مقارنة الوجوه بخاصية واحدة

تُؤخذ المسافة بين نقطتي جسر الأنف والذقن كعلامة (نقطتا المعالم 27 و 8 ، انظر الشكل ج). يتم تحديد الميزة ، المقيسة ، في UCS بالنسب: (Y1 - Y2) / L ، حيث L هي المسافة بين مراكز العيون. عند تدريب البرنامج ، يتم تحديد علامة شخص معين من خلال الرقم الذي يظهر بجانب الشخص المتعقب (يتم التعليق على هذا الجزء من الكود في البرنامج). أثناء التعرف ، تتم مقارنة قيمة الميزة بميزة معينة تم إدخالها في البرنامج لكل شخص. إذا كانت المقارنة إيجابية ، يظهر معرفها بجانب الوجه.

يتعرف البرنامج أيضًا على الصورة التي يبلغ عمري فيها 15 عامًا ، وحتى مع وجود شارب. الفرق في الصورة كبير ، ولن يلاحظه الجميع. لكن لا يمكن خداع برنامج الكمبيوتر.

مهام التحكم:

  1. تعرف على البرنامج.
  2. حدد معنى الميزة لوجهك ولعدد من زملائك.
  3. اختبر برنامج التعرف على الأفراد (أنت وزملائك).

#يشمل #يشمل #يشمل #يشمل #يشمل #يشمل # تضمين "drawLandmarks.hpp" باستخدام مساحة الاسم std؛ باستخدام مساحة الاسم السيرة الذاتية ؛ باستخدام مساحة الاسم السيرة الذاتية :: الوجه ؛ int main (int argc، char ** argv) (// تحميل كاشف الوجه CascadeClassifier faceDetector ("haarcascade_frontalface_alt2.xml") ؛ // إنشاء مثيل من Facemark Ptr facemark = FacemarkLBF :: create () ، // تحميل أداة الكشف عن المعالم-> loadModel ("lbfmodel.yaml") ؛ // إعداد كاميرا الويب لالتقاط الفيديو VideoCapture cam (0) ؛ // متغير لتخزين إطار الفيديو وإطار مات التدرج الرمادي الخاص به ، رمادي ؛ // اقرأ إطارًا أثناء (قراءة الكاميرا (إطار)) (// ابحث عن متجه الوجه الوجوه. // تحويل الإطار إلى تدرج رمادي لأن // faceDetector يتطلب صورة ذات تدرج رمادي. cvtColor (إطار ، رمادي ، COLOR_BGR2GRAY) ؛ // كشف الوجوه faceDetector.detectMultiScale (الرمادي ، الوجوه) ؛ // متغير للمعالم. // معالم وجه واحد هي متجه من النقاط // يمكن أن يكون هناك أكثر من وجه واحد في الصورة. ومن ثم ، فإننا نستخدم / / متجهًا من متجه النقاط. المتجه< vector> المعالم ؛ // تشغيل مستكشف المعالم bool Success = facemark-> ملائم (الإطار ، الوجوه ، المعالم) ؛ إذا (نجاح) (// إذا نجحت ، قم بتصيير المعالم على الوجه لـ (size_t i = 0 ؛ i< faces.size(); i++) { cv::rectangle(frame, faces[i], Scalar(0, 255, 0), 3); } for (int i = 0; i < landmarks.size(); i++) { //if((i >= 30) && (أنا<= 35)) drawLandmarks(frame, landmarks[i]); for (size_t j = 0; j < landmarks[i].size(); j++) { circle(frame, Point(landmarks[i][j].x, landmarks[i][j].y), 1, Scalar(255, 0, 0), 2); } line(frame, Point(landmarks[i].x, landmarks[i].y), Point(landmarks[i].x, landmarks[i].y), Scalar(0, 0, 255), 2); float XL = (landmarks[i].x + landmarks[i].x) / 2; float YL = (landmarks[i].y + landmarks[i].y) / 2; float XR = (landmarks[i].x + landmarks[i].x) / 2; float YR = (landmarks[i].y + landmarks[i].y) / 2; line(frame, Point(XL, YL), Point(XR, YR), Scalar(0, 0, 255), 2); float DX = XR - XL; float DY = YR - YL; float L = sqrt(DX * DX + DY * DY); float X1 = (landmarks[i].x); float Y1 = (landmarks[i].y); float X2 = (landmarks[i].x); float Y2 = (landmarks[i].y); float DX1 = abs(X1 - X2); float DY1 = abs(Y1 - Y2); float L1 = sqrt(DX1 * DX1 + DY1 * DY1); float X0 = (XL + XR) / 2; float Y0 = (YL + YR) / 2; float sin_AL = DY / L; float cos_AL = DX / L; float X_User_0 = (landmarks[i].x - X0) / L; float Y_User_0 = -(landmarks[i].y - Y0) / L; float X_User27 = X_User_0 * cos_AL - Y_User_0 * sin_AL; float Y_User27 = X_User_0 * sin_AL + Y_User_0 * cos_AL; X_User_0 = (landmarks[i].x - X0) / L; Y_User_0 = -(landmarks[i].y - Y0) / L; float X_User30 = X_User_0 * cos_AL - Y_User_0 * sin_AL; float Y_User30 = X_User_0 * sin_AL + Y_User_0 * cos_AL; if (abs(X_User27 - X_User30) <= 0.1) { //putText(frame, std::to_string(abs(L1 / L)), Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); if (abs((L1 / L) - 1.6) < 0.1) { putText(frame, "Roman", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } if (abs((L1 / L) - 1.9) < 0.1) { putText(frame, "Pasha", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } if (abs((L1 / L) - 2.1) < 0.1) { putText(frame, "Svirnesvkiy", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } } putText(frame, "Incorrect", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } } // Display results imshow("Facial Landmark Detection", frame); // Exit loop if ESC is pressed if (waitKey(1) == 27) break; } return 0; }

أهم مصادر المعلومات حول العالم الخارجي للإنسان الآلي هي أجهزة الاستشعار والكاميرات البصرية. بعد استلام الصورة ، من الضروري معالجتها لتحليل الموقف أو اتخاذ قرار. كما قلت باكرا، رؤية الكمبيوتريجمع بين العديد من طرق العمل مع الصور. أثناء تشغيل الروبوت ، من المفترض أن تتم معالجة معلومات الفيديو من الكاميرات بواسطة بعض البرامج التي تعمل على وحدة التحكم. حتى لا تكتب رمزًا من البداية ، يمكنك استخدام حلول برمجية جاهزة. يوجد حاليًا العديد من مكتبات رؤية الكمبيوتر الجاهزة:

  • مكتبة التصوير ماتروكس
  • مكتبة كاميليا
  • افتح eVision
  • هالكون
  • libCVD
  • أوبينكف
  • إلخ…
يمكن أن تختلف بيانات SDK اختلافًا كبيرًا في الوظائف وشروط الترخيص ولغات البرمجة المستخدمة. سوف نتعمق في الحديث أوبينكف... إنه مجاني للأغراض التعليمية والاستخدام التجاري. تمت كتابته بلغة C / C ++ المحسّنة ، ويدعم واجهات C و C ++ و Python و Java ويتضمن أكثر من 2500 خوارزمية. بالإضافة إلى وظائف معالجة الصور القياسية (التصفية ، التعتيم ، التحولات الهندسية ، إلخ) ، تسمح لك SDK هذه بحل المهام الأكثر تعقيدًا ، والتي تشمل اكتشاف كائن في الصورة و "التعرف عليه". يجب أن يكون مفهوماً أن مهام الكشف والتعرف يمكن أن تكون مختلفة تمامًا:
  • البحث والتعرف على كائن معين ،
  • البحث عن كائنات من نفس الفئة (بدون التعرف) ،
  • التعرف على الأشياء فقط (صورة جاهزة بها).
لاكتشاف الميزات في صورة والتحقق من وجود تطابق ، يتبع OpenCV الطرق التالية:
  • الرسم البياني للتدرجات الموجهة (HOG) - يمكن استخدامه للكشف عن المشاة
  • خوارزمية فيولا جونز - تستخدم للعثور على الوجوه
  • خوارزمية الكشف عن ميزة SIFT (تحويل الميزات الثابتة للمقياس)
  • ميزة خوارزمية الكشف عن ميزة SURF (الميزات القوية المعجلة)
على سبيل المثال ، يكتشف SIFT مجموعات النقاط التي يمكن استخدامها لتحديد كائن. بالإضافة إلى التقنيات المذكورة أعلاه ، يحتوي OpenCV على خوارزميات أخرى للكشف والتعرف ، بالإضافة إلى مجموعة من الخوارزميات المتعلقة بالتعلم الآلي ، مثل k- الأقرب للجيران ، والشبكات العصبية ، وآلات ناقلات الدعم ، وما إلى ذلك بشكل عام ، يوفر OpenCV مجموعة أدوات كافية لحل الغالبية العظمى من مشاكل رؤية الكمبيوتر. إذا لم يتم تضمين الخوارزمية في SDK ، فيمكن ، كقاعدة عامة ، برمجتها دون مشاكل. بالإضافة إلى ذلك ، هناك العديد من إصدارات المؤلفين من الخوارزميات التي كتبها المستخدمون بناءً على OpenCV. وتجدر الإشارة أيضًا إلى أن OpenCV قد توسع كثيرًا في السنوات الأخيرة وأصبح "وزنًا ثقيلًا" إلى حد ما. في هذا الصدد ، تقوم مجموعات مختلفة من المتحمسين بإنشاء مكتبات "خفيفة الوزن" تعتمد على OpenCV. أمثلة: SimpleCV ، liuliu ccv ، tinycv ... مواقع مفيدة
  1. http://opencv.org/ - الموقع الرئيسي للمشروع
  2. http://opencv.willowgarage.com/wiki/ - موقع مشروع قديم به وثائق للإصدارات القديمة