2015-07-07 25 views
5

Nel mio previous question ho appreso che ho dovuto installare opencv-contrib per poter utilizzare OpenCV Python con moduli esterni come SIFT. Nel mio progetto, tuttavia, voglio usare ORB o qualcosa di simile. cv2.ORB() non funziona, né cv2.xfeatures2d.ORB_create() o qualsiasi altra agglutinazione di comandi.OpenCV non trova ORB

Per quanto ne so, OpenCV ha una documentazione piuttosto scarsa per la sua API Python.

Come utilizzare ORB per abbinare le funzioni in OpenCV Python?

MWE:

#!/usr/bin/python2.7 
import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img = cv2.imread('smallburger.jpg',0) 

# Initiate STAR detector 
orb = cv2.ORB() 

# find the keypoints with ORB 
kp = orb.detect(img,None) 

# compute the descriptors with ORB 
kp, des = orb.compute(img, kp) 

# draw only keypoints location,not size and orientation 
img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0) 
plt.imshow(img2),plt.show() 

uscita CLI:

Traceback (most recent call last): 
    File "./mwe.py", line 9, in <module> 
    orb = cv2.ORB() 
AttributeError: 'module' object has no attribute 'ORB' 

risposta

1

Ecco il mio codice per la formazione

def featureMatchingBF(self,img1,img2,method): 
    corners = cv2.goodFeaturesToTrack(img1, 7, 0.05, 25) 
    corners = np.float32(corners) 

    for item in corners: 
     x, y = item[0] 
     cv2.circle(img1, (x,y), 5, (255,0,0)) 

    cv2.imshow("Top 'k' features", img1) 
    cv2.waitKey() 

    #======================================================================= 
    # (H1, hogImage1) = feature.hog(img1, orientations=9, pixels_per_cell=(6, 6), 
    # cells_per_block=(2, 2), transform_sqrt=True, visualise=True) 
    # hogImage1 = exposure.rescale_intensity(hogImage1, out_range=(0, 255)) 
    # hogImage1 = hogImage1.astype("uint8") 
    # cv2.imshow("Input:",img1) 
    # cv2.imshow("HOG Image", hogImage1) 
    # cv2.waitKey(0) 
    #======================================================================= 
    if method is "ORB": 
     #Compute keypoints for both images 
     kp1,des1 = self.computeORB(img1) 
     kp2,des2 = self.computeORB(img2) 
     #=================================================================== 
     # for i,j in zip(kp1,kp2): 
     #  print("KP1:",i.pt) 
     #  print("KP2:",j.pt) 
     #=================================================================== 
     #use brute force matcher for matching descriptor1 and descriptor2 
     bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 
     # Match descriptors. 
     matches = bf.match(des1,des2) 

     # Sort them in the order of their distance. 
     matches = sorted(matches, key = lambda x:x.distance) 
     self.filterMatches(matches) 

     # Draw first 10 matches. 
     img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:20], flags=2,outImg = img1) 

     #show result 
     cv2.imshow("Matches",img3) 
     cv2.waitKey(0) 

def computeORB(self,img): 
    #Initiate ORB detector 
    orb = cv2.ORB_create() 

    #find keypoints 
    kp = orb.detect(img,None) 

    #compute despriptor 
    kp, des = orb.compute(img,kp) 
    # draw only keypoints location,not size and orientation 
    img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0), flags=0) 
    #plt.imshow(img2), plt.show() 

    return kp,des