1

我正在使用以下简单的行从图像中提取 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 这样的整数值?

4

1 回答 1

1

我不确定 OpenCV 会发生什么,但就论文而言,这就是 SURF 所做的。SURF 描述符将一个小图像块划分为 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 维描述符的大小加倍。

于 2013-10-30T00:52:44.487 回答