2015-10-14 5 views
5

Seit der Version 3.0 ist der DenseFeatureDetector nicht mehr verfügbar. Könnte mir bitte jemand zeigen, wie man die dichten SIFT-Funktionen in OpenCV 3.0 berechnet? Ich konnte es in der Dokumentation nicht finden.Berechnung von dichten SIFT-Funktionen in OpenCV 3.0

Vielen Dank im Voraus!

+0

Sie meinen etwas wie DAISY Funktionen? Es ist in opencv 3.0, aber im externen contrib-Paket. Sie müssen es selbst kompilieren – DawidPi

+0

@DawidPi: Ich habe opencv_contrib installiert und enthalten xfeature2d in das Projekt, konnte aber nichts wie DenseFeatureDetector finden. Dichte SIFT sind einfach SIFT-Features, die auf einem Raster in unterschiedlichem Maßstab berechnet werden. – Khue

+0

Implementierung von DenseFeatureDetector detectImpl war wie folgt. Ich schätze, du kannst das alleine machen, aber ich schätze, ich kann dir nicht mehr helfen, da ich weder Mathematiker noch CV-Experte bin. https://github.com/Itseez/opencv/blob/2.4/modules/features2d/src/detectors.cpp#L162 – DawidPi

Antwort

2

Hier ist, wie ich dichte SIFT in OpenCV 3 C++ verwendet:

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); 

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

scheint gut zu funktionieren

+0

Wenn ich Features aus mehreren Bildern extrahieren möchte ... Soll ich zuerst alle Bilder auf eine gemeinsame Größe skalieren? –

+0

Vielen Dank. (Und Entschuldigung für die Verzögerung) – Khue

5

Sie können eine Liste von cv2.KeyPoints an sift.compute übergeben. Dieses Beispiel ist in Python, aber es zeigt das Prinzip. Ich erstelle eine Liste von cv2.KeyPoint s durch das Scannen durch die Pixelstellen des Bildes:

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

Hi verwenden, wissen Sie, wie Sie Kontrast anwenden Schwelle in diesem Fall? Ich habe versucht, contrastThreshold Parameter in SIFT_create() hinzuzufügen, aber es wurde ignoriert. – pomxipum

+0

Ich bin mir nicht 100% sicher, aber es sieht so aus, als müssten Sie es selbst implementieren. Die Antwort ist kompliziert genug, um es als eine separate Frage zu posten. Allerdings scheint der Kontrast hier berechnet zu werden https://github.com/opencv/opencv_contrib/blob/7238cd27bae5436605d9e32ca0b87f266381a9e0/modules/xfeatures2d/src/sift.cpp#L457 –

Verwandte Themen