ORB ve Brute-Force Matcher ile nesne tanıma


#1

Merhaba,

OpenCV tutoriallarında ve https://github.com/thecodacus/object-recognition-sift-surf/blob/master/Detector.py örneğinde bulunan kodu denemeye çalıştım fakat SIFT algoritması çalışmadı. Bunun nedenini SIFT algoritmasının artık patentli olmasıymış. Dolayısıyla algoritmamı ORB’a çevirdim. Fakat bu sefer de ORB’un Binary-string descriptors yapısından dolayı FLANN ile bir uyumsuzluk oldu. FLANN’ı da Brute-Force Matcher’a çevirip aşağıdaki kodu oluşturdum.

import cv2
import numpy as np
MIN_MATCH_COUNT = 30

#SIFT SUFT patentli olduğu için orb kullandım.
detector = cv2.ORB_create()

#flann ile yapınca type = 0 hatası veriyor. bu yüzden bf matcher kullandım.
bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False)

trainImg = cv2.imread('deneme.jpeg', 0)
trainKP, trainDesc= detector.detectAndCompute(trainImg, None)

cam=cv2.VideoCapture(0)
while True:
ret, QueryImgBGR=cam.read()
QueryImg=cv2.cvtColor(QueryImgBGR,cv2.COLOR_BGR2GRAY)
queryKP,queryDesc=detector.detectAndCompute(QueryImg,None)
matches = bf.knnMatch(trainDesc,queryDesc,k=2) #queryDesc'de hata?queryDesc,

goodMatch=[]
for m,n in matches:
    if(m.distance<0.75*n.distance):
        goodMatch.append(m)
if(len(goodMatch)>MIN_MATCH_COUNT):
    tp=[]
    qp=[]
    for m in goodMatch:
        tp.append(trainKP[m.trainIdx].pt)
        qp.append(queryKP[m.queryIdx].pt)
    tp,qp=np.float32((tp,qp))
    H,status=cv2.findHomography(tp,qp,cv2.RANSAC,3.0)
    h,w=trainImg.shape
    trainBorder=np.float32([[[0,0],[0,h-1],[w-1,h-1],[w-1,0]]])
    queryBorder=cv2.perspectiveTransform(trainBorder,H)
    cv2.polylines(QueryImgBGR,[np.int32(queryBorder)],True,(0,255,0),5)
else:
    print ("Not Enough match found-")
cv2.imshow('result',QueryImgBGR)
if cv2.waitKey(10)==ord('q'):
    break
cam.release()
cv2.destroyAllWindows()

Fakat bu kod başarılı bir şekilde nesneyi tanıyamıyor. Örnek bir fotoğrafı yaklaştırdığımda sınırlarından değil fakat fotoğrafın içinde rastgele yerlerde yeşil işaretler çıkıyor. Bir süre sonra ise şu hatayı alıyorum

Traceback (most recent call last):
File "C:\123.py", line 30, in <module>
qp.append(queryKP[m.queryIdx].pt)
IndexError: list index out of range

Objeyi bulamamanın ve hatanın nedenini anlayamadım. Yardımcı olabilirseniz çok sevinirim.


#3

teşekkürler @birolkuyumcu

contrib kısmı için pip install opencv-contrib-python komutunu denemiştim fakat

Requirement already satisfied: opencv-contrib-python in c:\users\appdata\local\programs\python\python37\lib\site-packages (4.0.0.21)
Requirement already satisfied: numpy>=1.14.5 in c:\users\appdata\local\programs\python\python37\lib\site-packages (from opencv-contrib-python) (1.16.0)

yanıtı alıyorum. CMake kullanıp tekrar yüklemem mi gerekir?


#2
  1. SIFT ve SURF u contrib kısmında bulabilirsiniz
  2. Hata mesajına göre m.queryIdx olmayan bir değeri tutuyor
  3. Hiç bir metod için her şeyi her zaman bulabilir gibi bir garantisi olmaz
  4. Bu metodlara noktalar bulunur ve eşleştirme yapılır. Ya nesneniz de yeterince nokta bulunamıyor ya da eleştirirken hata yapılıyordur

#4

https://docs.opencv.org/3.4/d2/dca/group__xfeatures2d__nonfree.html