import cv2 as cv
image = cv.imread("C:/temp/1.png")
gray_image= cv.cvtColor(image,cv2.COLOR_BGR2GRAY)
sift = cv.SIFT()
kp = sift.detect(gray_image,None)
image=cv.drawKeypoints(gray_image,kp)
cv.imshow(image)
cv.waitKey()
cv.destroyAllWindows()
والنتيجة:
بدايةً علينا أن نقوم ببناء جسم SIFT، ثم نقوم بتمرير البيانات المختلفة إليه (اختياري).
أولاً نقوم بقراءة الصورة وتحويلها للصيغة الرمادية:
image = cv.imread("C:/temp/1.png")
gray_image= cv.cvtColor(image,cv2.COLOR_BGR2GRAY)
ثم نقوم بإنشاء جسم خوارزمية SIFT وذلك من خلال التابع cv2.SIFT:
sift = cv.SIFT()
ثم نستخدم التابع sift.detect لإيجاد النقاط الرئيسية في الصورة. يمكنك تمرير قناع إذا أردت البحث عنها فقط في جزء محدد. كل نقطة رئيسية لها تركيب خاص وهي تحوي على العديد من الخصائص مثل الإحداثيات x و y، وحجم الجوار ذو المعنى، والزاوية التي تحدد الاتجاه، والاستجابة التي تحدد قوة النقاط الرئيسية.
kp = sift.detect(gray_image,None)
أيضاً استخدمنا التابع:
image=cv.drawKeypoints(gray_image,kp)
الذي يقوم برسم دوائر صغيرة في مواقع النقاط الرئيسية. وإذا مررت cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS له، فسوف يرسم دائرة بحجم النقطة الأساسية وسيعرض أيضاً الاتجاه. أي:
img=cv2.drawKeypoints(gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
النتيجة ستكون:
الآن لحساب الوصف يمكننا القيام بذلك بطريقتين:
1. في حالة أوجدنا النقاط الرئيسية (كما فعلنا) ،استخدم الدالة sift.compute التي تحسب الوصف من خلال النقاط الرئيسية.
kp,des = sift.compute(gray_image,kp)
2. إذا لم تقوم بإيجاد النقاط الرئيسية، عندها يمكنك إيجاد النقاط الرئيسية+الوصف من خلال الدالة sift.detectAndCompute:
sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray_image,None)
هنا kp تمثل مصفوفة بالنقاط الرئيسية، و des تمثل مصفوفة من الشكل (عدد النقاط * 28) .