OpenCV не может найти ORB

В моем предыдущем вопросе я узнал, что мне нужно установить opencv-contrib, чтобы использовать OpenCV Python с внешними модулями, такими как SIFT. Однако в моем проекте я хочу использовать ORB или что-то подобное. cv2.ORB() не работает, как и cv2.xfeatures2d.ORB_create() или любая другая агглютинация команд.

Как известно, OpenCV имеет довольно плохую документацию для своего Python API.

Как использовать ORB для сопоставления функций в 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()

Вывод командной строки:

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

person Simon Kuang    schedule 07.07.2015    source источник


Ответы (2)


Глупый OpenCV. Это просто cv2.ORB_create().

person Simon Kuang    schedule 07.07.2015

Вот вам мой код для обучения

    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
person Max Krappmann    schedule 03.11.2017