2015-10-14 35 views
5

Od wersji 3.0 narzędzie DenseFeatureDetector nie jest już dostępne. Czy ktokolwiek mógłby mi pokazać, jak obliczyć gęstych funkcji SIFT w OpenCV 3.0? Nie mogłem go znaleźć w dokumentacji.Obliczyć Gęste funkcje SIFT w OpenCV 3.0

Dziękuję bardzo z góry!

+0

Masz na myśli coś takiego jak funkcje DAISY? Jest w wersji opencv 3.0, ale w zewnętrznym pakiecie contrib. Musisz go skompilować samodzielnie – DawidPi

+0

@DawidPi: Mam opencv_contrib zainstalowane i włączone xfeature2d do projektu, ale nadal nie mogłem znaleźć czegoś takiego jak DenseFeatureDetector. Gęste SIFT to po prostu funkcje SIFT obliczane na siatce w różnej skali. – Khue

+0

Implementacja DenseFeatureDetector detectImpl wyglądała następująco. Sądzę, że możesz to zrobić sam, ale chyba nie mogę ci więcej pomóc, ponieważ nie jestem matematykiem ani ekspertem od CV. https://github.com/Itseez/opencv/blob/2.4/modules/features2d/src/detectors.cpp#L162 – DawidPi

Odpowiedz

2

Oto jak kiedyś gęstą przesiać w 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); 

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

wydaje się działać dobrze

+0

Jeśli chcę wyodrębnić funkcje z kilku obrazów ... Czy najpierw powinienem zmienić rozmiar wszystkich obrazów na zwykły rozmiar? –

+0

Wielkie dzięki. (I przepraszam za opóźnienie) – Khue

5

Możesz przesłać listę cv2.KeyPoints do sift.compute. Ten przykład jest w Pythonie, ale pokazuje zasadę. Tworzę listę cv2.KeyPoint s poprzez skanowanie przez lokalizacji piksela obrazu:

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

Witam, czy wiesz, jak zastosować kontrast próg w tym przypadku? Próbowałem dodać parametr contrastThreshold w SIFT_create(), ale został on zignorowany. – pomxipum

+0

Nie jestem w 100% pewny, ale wygląda na to, że sam musisz to zaimplementować. Odpowiedź jest na tyle skomplikowana, aby zamieścić ją jako osobne pytanie. Jednak kontrast wydaje się być obliczany tutaj https://github.com/opencv/opencv_contrib/blob/7238cd27bae5436605d9e32ca0b87f266381a9e0/modules/xfeatures2d/src/sift.cpp#L457 –