Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compute Dense SIFT features in OpenCV 3.0

Since version 3.0, DenseFeatureDetector is no longer available. Could anybody please show me how to compute Dense SIFT features in OpenCV 3.0? I couldn't find it in the documentation.

Thank you very much in advance!

like image 731
f10w Avatar asked Oct 14 '15 09:10

f10w


People also ask

Is SIFT available in OpenCV?

Example: SIFT detector in Python jpg” generates the “image-with-keypoints. jpg” which contains the interest points, detected using the SIFT module in OpenCV, marked using circular overlays. Note: SIFT detector has been removed in the latest versions of OpenCV ( ≥ 3.4. 2.16).

What is dense SIFT?

Dense SIFT collects more features at each location and scale in an image, increasing recognition accuracy accordingly. However, computational complexity will always be an issue for it (in relation to normal SIFT).


2 Answers

You can pass a list of cv2.KeyPoints to sift.compute. This example is in Python, but it shows the principle. I create a list of cv2.KeyPoints by scanning through the pixel locations of the image:

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)
like image 193
P.R. Avatar answered Oct 01 '22 21:10

P.R.


Here's how I used dense 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);

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

seems to work well

like image 44
tyhenry Avatar answered Oct 01 '22 21:10

tyhenry