Contours : Getting Started

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 05, 2020

هدف

  • یادگیری پیدا کردن خطوط ، رسم خطوط و غیره
  • این توابع را مشاهده خواهید کرد: cv.findContours ()، cv.drawContours ()

کانتور چیست؟

خطوط را می توان به سادگی به عنوان منحنی پیوسته به تمام نقاط ناحیه مرزی جسم ، دارای رنگ یا شدت یکسان توضیح داد. خطوط ابزاری مفید برای تجزیه و تحلیل شکل و تشخیص شی object است.

برای دقت بهتر ، از تصاویر باینری استفاده کنید. بنابراین قبل از پیدا کردن خطوط ، آستانه یا لبه را مشاهده کنید.
از آنجا که OpenCV 3.2 ، findContours () دیگر تصویر منبع را اصلاح نمی کند.
در OpenCV یافتن خطوط مانند یافتن جسم سفید از پس زمینه سیاه است. بنابراین به یاد داشته باشید ، شیئی که باید پیدا شود باید سفید و زمینه باید سیاه باشد.
بیایید ببینیم چگونه می توان خطوط یک تصویر باینری را پیدا کرد:

import numpy as np
import cv2
im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

توجه : این متد برای یدا کردن خطوط مرزی جسم در هر شرایطی مناسب نیست و نیاز به حذف نویز نیز می باشد

چگونه می توان خطوط را ترسیم کرد؟

برای ترسیم خطوط ، از تابع cv.drawContours استفاده می شود. همچنین می تواند برای ترسیم هر شکلی به شرط داشتن نقاط مرزی آن استفاده شود. اولین آرگومان آن تصویر منبع است ، آرگومان دوم خطوطی است که باید به عنوان یک لیست پایتون منتقل شود ، آرگومان سوم نمایه ای از خطوط است (هنگام ترسیم منحنی منحصر به فرد مفید است. برای ترسیم تمام خطوط ، عبور از -1) و آرگومان های باقی مانده رنگ ، ضخامت هستند و غیره.

  • برای ترسیم تمام خطوط در یک تصویر:
    cv2.drawContours(img, contours, -1, (0,255,0), 3)
  • برای ترسیم یک کانتور منفرد ، چهارمین خط را بگویید:
    cv2.drawContours(img, contours, 3, (0,255,0), 3)
  • اما بیشتر اوقات ، روش زیر مفید خواهد بود:
    cnt = contours[4]
    cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

توجه : دو روش آخر یکسان هستند ، اما وقتی جلو بروید ، خواهید دید که آخرین مورد مفیدتر است.

روش تقریب کانتور

این سومین آرگومان در عملکرد cv.findContours است. در واقع چه چیزی را نشان می دهد؟

در بالا ، ما گفتیم که خطوط حد فاصل یک شکل با شدت یکسان هستند. مختصات (x، y) مرز یک شکل را ذخیره می کند. اما آیا همه مختصات را ذخیره می کند؟ که با این روش تقریب کانتور مشخص شده است.

اگر cv.CHAIN_APPROX_NONE را تصویب کنید ، تمام نقاط مرزی ذخیره می شوند. اما در واقع آیا ما به همه نکات نیاز داریم؟ به عنوان مثال ، شما خط یک خط مستقیم را پیدا کردید. آیا برای نمایش آن خط به تمام نقاط روی خط نیاز دارید؟ نه ، ما فقط به دو نقطه ابتدایی و انتهایی از آن خط احتیاج داریم. این همان کاری است که cv.CHAIN_APPROX_SIMPLE انجام می دهد. تمام نقاط زائد را از بین می برد و کانتور را فشرده می کند و در نتیجه حافظه را ذخیره می کند.

در زیر تصویر یک مستطیل این روش نشان داده شده است. کافیست روی تمام مختصات موجود در آرایه کانتور یک دایره بکشید (با رنگ آبی رسم شده).

  • تصویر اول در سمت چپ CHAIN_APPROX_NONE (734 نقطه)  نشان می دهد.
  • تصویر دوم در سمت راست  CHAIN_APPROX_SIMPLE (فقط 4 نقطه)  نشان می دهد.

 چقدر فضای حافظه ذخیره می شود !!!

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه