我使用以下简单的代码从图像中提取 SURF 描述符:
Ptr<DescriptorExtractor> descriptor = DescriptorExtractor::create("SURF");
descriptor->compute(im1, kp, desc1);
现在,当我“观察”变量 desc1.data 时,它包含 0 到 255 范围内的整数值。
但是,当我使用代码调查这些值时:
for (int j=0;j<desc1.cols; j++){
float a=desc1.at<float>(0,j);
它包含介于 -1 和 1 之间的值。这怎么可能? SURF 不应该像 SIFT 那样返回整数值?
最佳答案
我不确定 OpenCV 中会发生什么,但就论文而言,这就是 SURF 所做的。 SURF 描述符将一个小图像 block 划分为 4x4 子区域,并以巧妙的方式计算每个子区域的小波响应。基本上它是一个 4 元组描述符 < sum(dx), sum(dy), sum(|dx|), sum(|dy|)>,其中 dx, dy 是每个子区域中的小波响应。描述符是通过连接所有响应并对幅度进行归一化而构建的,这会产生 64 维描述符。从描述中可以清楚地看出,归一化的 sum(dx) 和 sum(dy) 值介于 -1 和 1 之间,而 sum(|dx|) 和 sum(|dy|) 介于 0 到 1 之间。如果您看到128 维描述符,dx 和 |dx| 的总和分别计算 dx >= 0 和 dy < 0,这使 64 维描述符的大小加倍。
关于opencv - SURF 描述符的值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19610629/