2015-10-14 16 views
5

Dalla versione 3.0, DenseFeatureDetector non è più disponibile. Qualcuno potrebbe per favore mostrarmi come calcolare le funzionalità Dense SIFT in OpenCV 3.0? Non riuscivo a trovarlo nella documentazione.Funzioni SIFT Compute Dense in OpenCV 3.0

Grazie mille in anticipo!

+0

Intendi qualcosa come le caratteristiche di DAISY? È in opencv 3.0 ma in un pacchetto contrib esterno. Devi compilarlo da solo – DawidPi

+0

@DawidPi: Ho installato opencv_contrib e ho incluso xfeature2d nel progetto, ma ancora non ho trovato nulla come DenseFeatureDetector. Denso SIFT è semplicemente funzioni SIFT calcolate su una griglia su scala diversa. – Khue

+0

Implementazione di DenseFeatureDetector detectImpl era così. Immagino che tu possa farlo da solo, ma credo di non poterti aiutare di più visto che non sono un matematico né un esperto di CV. https://github.com/Itseez/opencv/blob/2.4/modules/features2d/src/detectors.cpp#L162 – DawidPi

risposta

2

ecco come ho usato densa SIFT in OpenCV 3 C++:

SiftDescriptorExtractor sift; 

vector<KeyPoint> keypoints; // keypoint storage 
Mat descriptors; // descriptor storage 

// manual keypoint grid 

int step = 10; // 10 pixels spacing between kp's 

for (int y=step; y<img.rows-step; y+=step){ 
    for (int x=step; x<img.cols-step; x+=step){ 

     // x,y,radius 
     keypoints.push_back(KeyPoint(float(x), float(y), float(step))); 
    } 
} 

// compute descriptors 

sift.compute(img, keypoints, descriptors); 

copiati da: http://answers.opencv.org/question/73165/compute-dense-sift-features-in-opencv-30/?answer=73178#post-id-73178

sembra funzionare bene

+0

Se voglio estrarre le caratteristiche da diverse immagini ... Devo prima ridimensionare tutte le immagini con una dimensione comune? –

+0

Grazie mille. (E mi dispiace per il ritardo) – Khue

5

È possibile passare un elenco di cv2.KeyPoints a sift.compute. Questo esempio è in Python, ma mostra il principio. Creo un elenco di cv2.KeyPoint s di scansione attraverso le posizioni dei pixel dell'immagine:

import skimage.data as skid 
import cv2 
import pylab as plt 

img = skid.lena() 
gray= cv2.cvtColor(img ,cv2.COLOR_BGR2GRAY) 

sift = cv2.xfeatures2d.SIFT_create() 

step_size = 5 
kp = [cv2.KeyPoint(x, y, step_size) for y in range(0, gray.shape[0], step_size) 
            for x in range(0, gray.shape[1], step_size)] 

img=cv2.drawKeypoints(gray,kp, img) 

plt.figure(figsize=(20,10)) 
plt.imshow(img) 
plt.show() 

dense_feat = sift.compute(gray, kp) 
+0

Ciao, sai come applicare il contrasto soglia in questo caso? Ho provato ad aggiungere il parametro contrastThreshold in SIFT_create() ma è stato ignorato. – pomxipum

+0

Non sono sicuro al 100%, ma sembra che tu debba implementarlo da solo. La risposta è abbastanza complicata da postarla come una domanda separata. Tuttavia, il contrasto sembra essere calcolato qui https://github.com/opencv/opencv_contrib/blob/7238cd27bae5436605d9e32ca0b87f266381a9e0/modules/xfeatures2d/src/sift.cpp#L457 –