opencv - SURF 描述符的值是多少?

标签 opencv image-processing computer-vision

我使用以下简单的代码从图像中提取 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/

相关文章:

python - OpenCV:在不使用 RETR_EXTERNAL 的情况下删除形状轮廓上的双轮廓

.net - 使用 OpenCV 的感兴趣区域

opencv - 如何在OpenCV中增加Haar检测器的窗口大小

matlab - double类型的帧必须在0到1的范围内 : MATLAB

computer-vision - 如果两个图像之间的变换已知,则找到相机位置之间的变换

python - 查找法线图像和透视图像之间的角度

opencv - 使用不同参数测试我的 SVM 模型会产生完全相同的结果

python - 属性错误 : 'numpy.ndarray' object has no attribute 'getdraw'

node.js - 检测 Image Nodejs OpenCV 特定区域的颜色

c++ - 用于极端图像缩小的快速、高质量像素插值