Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV-Python dense SIFT

OpenCV has very good documentation on generating SIFT descriptors, but this is a version of "weak SIFT", where the key points are detected by the original Lowe algorithm. The OpenCV example reads something like:

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)
kp,des = sift.compute(gray,kp)

What I'm looking for is strong/dense SIFT, which does not detect keypoints but instead calculates SIFT descriptors for a set of patches (e.g. 16x16 pixels, 8 pixels padding) covering an image as a grid. As I understand it, there are two ways to do this in OpenCV:

  • I could divide the image in a grid myself, and somehow convert those patches to KeyPoints
  • I could use a grid-based feature detector

In other words, I'd have to replace the sift.detect() line with something that gives me the keypoints I require.

My problem is that the rest of the OpenCV documentation, especially wrt Python, is severely lacking, so I have no idea how to achieve either of these things. I see in the C++ documentation that there are keypoint detectors for grid, but I don't know how to use these from Python.

The alternative is to switch to VLFeat, which has a very good DSift/PHOW implementation but means that I'll have to switch from python to matlab.

Any ideas? Thanks.

like image 741
Doa Avatar asked Nov 22 '13 13:11

Doa


People also ask

Is SIFT available in Opencv?

SIFT in OpenCV Note that these were previously only available in the opencv contrib repo, but the patent expired in the year 2020. So they are now included in the main repo.

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

How does SIFT work Opencv?

SIFT (Scale Invariant Fourier Transform) Detector is used in the detection of interest points on an input image. It allows identification of localized features in images which is essential in applications such as: Object Recognition in Images.


1 Answers

You can use Dense Sift in opencv 2.4.6 <. Creates a feature detector by its name.

cv2.FeatureDetector_create(detectorType)

Then "Dense" string in place of detectorType

eg:-

dense=cv2.FeatureDetector_create("Dense")
kp=dense.detect(imgGray)
kp,des=sift.compute(imgGray,kp)
like image 82
madan ram Avatar answered Sep 19 '22 06:09

madan ram