#!/usr/bin/env python
# coding: utf-8
# #
پیدا کردن گوشهها با روش Shi-Tomasi
#
# در نوتبوک قبلی روش Harris برای پیدا کردن گوشه ها را مشاهده کردیم، بعد از معرفی این روش، چند سال بعد در سال 1994 میلادی دو محقق با نامهای Shi و Tomasi به کمی تغییرات در روش Harris در مقاله ای تحت عنوان Good Features to Track به دقت بهتر دست یافتند.
#
# تابع امتیاز دهی در آشکارساز گوشه هریس توسط:
#
#
# $$R = \lambda_1 \lambda_2 - k(\lambda_1+\lambda_2)^2$$
#
# که این دو محقق با بازنگری در این تابع امتیاز دهی به جای فرمول بالا از فرول زیر استفاده کردند:
#
#
# $$R = \min(\lambda_1, \lambda_2)$$
#
# که مثل سابق، اگر مقدار این تابع بیشتر از حد آستانه باشد، گوشه محسوب می شود.
#
#
#
#
# که طبق تصویر ناحیهی سبز رنگ به معنای این است که هم
# $\lambda_1$
# و هم
# $\lambda_2$
# بالای حد آستانه هستند که به معنی وجود گوشه است!
#
#
# در OpenCV این روش در تابع goodFeaturesToTrack پیاده سازی شده است.
# این تابع به عنوان پارامتر ورودی روش گوشه یابی را از شما دریافت کرده (Shi-Tomasi یا تشخیص گوشه هریس، اگر مشخص کنید) و سپس N گوشه قوی تر(بزرگترین اعداد متریک بالا) را پیدا می کند.
# طبق معمول، تصویر باید یک تصویر سطح-خاکستری باشد.
# سپس تعداد گوشه هایی را که می خواهید پیدا کنید مشخص می کنید.
# سپس سطح کیفیت را مشخص میکنید که مقداری بین 0-1 است که نشاندهنده حداقل کیفیت گوشهای است که زیر آن همه رد میشوند.
# سپس حداقل فاصله اقلیدسی بین گوشه های شناسایی شده را ارائه می کنیم.
#
#
# برای مثال در کد زیر تلاش میکنیم که 25 گوشه برتر را پیدا کنیم:
#
# In[2]:
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/blox.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show();
# https://docs.opencv.org/4.x/d4/d8c/tutorial_py_shi_tomasi.html