Pregunta

I am trying to extract different point descriptors (SIFT, SURF, ORB, BRIEF,...) to build Bag of Visual words. The problem seems to be that I am using very small images : 12x60px. Using a dense extractor I am able to get some keypoints, but then when extracting the descriptor no data is extracted.

Here is the code :

vector<KeyPoint> points;
Mat descriptor; // descriptor of the current image
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("BRIEF");
Ptr<FeatureDetector> detector(new DenseFeatureDetector(1.f,1,0.1f,6,0,true,false));
image = imread(filename, 0);
roi = Mat(image,Rect(0,0,12,60));

detector->detect(roi,points);

extractor->compute(roi,points,descriptor);
cout << descriptor << endl;

The result is [] (with BRIEF and ORB) and SegFault (with SURF and SIFT). Does anyone have a clue on how to densely extract point descriptors from small images on OpenCV ? Thanks for your help.

¿Fue útil?

Solución 2

BRIEF and ORB use a 32x32 patch to get the descriptor. Since it doesn't fit your image, they remove those keypoints (to avoid returning keypoints without descriptor).

In the case of SURF and SIFT, they can use smaller patches, but it depends on the scale provided by the keypoint. In this case, I guess they have to use a bigger patch and the same as before happens. I don't know why you get a segfault, though; maybe the SIFT/SURF descriptor extractors don't check that keypoints are inside the image boundaries, as BRIEF/ORB ones do.

Otros consejos

Indeed, I finally managed to work my way to a solution. Thanks for the help.

I am now using an Orb detector with initalised parameters instead of a random one, e.g:

Ptr<DescriptorExtractor> extractor(new ORB(500, 1.2f, 8, orbSize, 0, 2, ORB::HARRIS_SCORE, orbSize));

I had to explore the documentation of OpenCV thoroughly before finding the answer to my problem : Orb documentation.

Also if people are using the dense point extractor they should be aware that after the descriptor computing process they may have less keypoints than produced by the keypoint extractor. The descriptor computing removes any keypoints for which it cannot get the data.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top