تشخیص و توصیف ویژگی

آشکارساز گوشه شی-توماسی و ویژگی‌های مناسب برای ردیابی

۲ دقیقه مطالعهOpenCV 5.xبه‌روزرسانی:

هدف#

در این فصل،

  • با آشکارساز گوشه دیگری آشنا خواهیم شد: آشکارساز گوشه شی-توماسی (Shi-Tomasi Corner Detector)
  • تابع زیر را خواهیم دید: ()cv.goodFeaturesToTrack

تئوری#

در فصل گذشته، آشکارساز گوشه هریس را دیدیم. بعداً در سال ۱۹۹۴، جی. شی و سی. توماسی (J. Shi and C. Tomasi) در مقاله خود با عنوان Good Features to Track تغییر کوچکی در آن ایجاد کردند که نتایج بهتری را در مقایسه با آشکارساز گوشه هریس نشان می‌دهد. تابع امتیازدهی در آشکارساز گوشه هریس به این صورت تعریف شده بود:

به جای این، شی-توماسی پیشنهاد داد:

اگر این مقدار بزرگ‌تر از یک مقدار آستانه باشد، به عنوان یک گوشه در نظر گرفته می‌شود. اگر آن را در فضای رسم کنیم همانطور که در آشکارساز گوشه هریس انجام دادیم، تصویری به شکل زیر به دست می‌آوریم:

آشکارساز گوشه شی-توماسی و ویژگی‌های مناسب برای ردیابی — تصویر ۱

از این شکل می‌توانید مشاهده کنید که تنها زمانی که و بالاتر از یک مقدار حداقل، یعنی باشند، به عنوان گوشه در نظر گرفته می‌شود (ناحیه سبز رنگ).

کد#

کتابخانه OpenCV تابعی به نام ()cv.goodFeaturesToTrack دارد. این تابع N گوشه قوی‌تر را در تصویر با روش شی-توماسی (یا در صورت تعیین شما، تشخیص گوشه هریس) پیدا می‌کند. طبق معمول، تصویر باید یک تصویر خاکستری باشد. سپس تعداد گوشه‌هایی را که می‌خواهید پیدا کنید مشخص می‌نمایید. بعد سطح کیفیت (Quality Level) را مشخص می‌کنید که مقداری بین ۰ تا ۱ است و حداقل کیفیت گوشه را نشان می‌دهد که هر گوشه‌ای کمتر از آن رد می‌شود. سپس حداقل فاصله اقلیدسی بین گوشه‌های شناسایی‌شده را ارائه می‌دهیم.

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

در مثال زیر، سعی خواهیم کرد ۲۵ گوشه برتر را پیدا کنیم:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('blox.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

corners = cv.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),3,255,-1)

plt.imshow(img),plt.show()

نتیجه را در زیر مشاهده کنید:

آشکارساز گوشه شی-توماسی و ویژگی‌های مناسب برای ردیابی — تصویر ۲

این تابع برای ردیابی (Tracking) مناسب‌تر است. زمانی که نوبتش برسد آن را خواهیم دید.