Manu Torres
Manu Torres

Reputation: 68

How to normalize OpenCV feature descriptors to an integer scale?

OpenCV SURF implementation returns a sequence of 64/128 32 bit float values (descriptor) for each feature point found in the image. Is there a way to normalize this float values and take them to an integer scale (for example, [0, 255])?. That would save important space (1 or 2 bytes per value, instead of 4). Besides, the conversion should ensure that the descriptors remain meaningful for other uses, such as clustering.

Thanks!

Upvotes: 1

Views: 2947

Answers (3)

gitfredy
gitfredy

Reputation: 409

The descriptor returned by cv::SurfFeatureDetector is already normalized. You can verify this by taking the L2 Norm of the cv::Mat returned, or refer to the paper.

Upvotes: 0

Sameer
Sameer

Reputation: 2505

You can treat the float features as an ordinary image (Mat or cvmat) and then use cv::normalize(). Another option is using cv::norm() to find the range of descriptor values and then cv::convertTo() to convert to CV_8U. Look up the OpenCV documentation for these functions.

Upvotes: 0

ahoffer
ahoffer

Reputation: 6526

There are other feature extractors than SURF. The BRIEF extractor uses only 32 bytes per descriptor. It uses 32 unsigned bytes [0-255] as its elements. You can create one like this:

Ptr ptrExtractor = DescriptorExtractor::create("BRIEF");

Be aware that a lot of image processing routines in OpenCV need or assume that the data is stored as floating-point numbers.

Upvotes: 0

Related Questions