为啥 Dense SIFT 会产生这些关键点?

Posted

技术标签:

【中文标题】为啥 Dense SIFT 会产生这些关键点?【英文标题】:Why Dense SIFT produces these keypoints?为什么 Dense SIFT 会产生这些关键点? 【发布时间】:2017-05-25 08:24:42 【问题描述】:

我正在尝试了解 Dense SIFT 如何使用 VLFeat documentation 和 API 工作。我正在测试 16x16 图像和 16x18 图像。

这是我正在使用的代码(也使用 OpenCV 处理图像):

//supposing we have cv::Mat img
//convert it to float pointer
cv::Mat imgFloat;
img.convertTo(imgFloat, CV_32F, 1.0/255.0);
if(!imgFloat.isContinuous())
    throw std::runtime_error("imgFloat is not continous");
//stepsize=2, binsize=4
VlDsiftFilter *dsift = vl_dsift_new_basic (img.cols, img.rows, 2, 4);
vl_dsift_process (dsift, imgFloat.ptr<float>());
std::cout<<"nKeyPoints= "<<vl_dsift_get_keypoint_num(dsift)<<std::endl;
VlDsiftKeypoint const * kpts = vl_dsift_get_keypoints (dsift);
for(int i=0 ; i<vl_dsift_get_keypoint_num(dsift) ; i++)
  std::cout<<i<<": x="<<kpts[i].x<<" y="<<kpts[i].y<<std::endl;

现在,考虑到 SIFT 默认使用 4x4 的 bin,这里每个 bin 的大小为 4px,我们的窗口是 16x16 的整个图像。只需使用这张图片(取自here)作为参考:

并且关键点位置应该在图像的完美中心,所以一个以下选项(假设索引从0开始):

7x7 7x8 8x7 8x8

(取决于实现)

这是输出(对于 16x16):

nKeyPoints= 4
0: x=6 y=6
1: x=8 y=6
2: x=6 y=8
3: x=8 y=8

这是针对 16x18 图像的:

nKeyPoints= 6
0: x=6 y=6
1: x=8 y=6
2: x=6 y=8
3: x=8 y=8
4: x=6 y=10
5: x=8 y=10

为什么会这样?

更新: 使用binsize=5,我们在x=7.5 y=7.5位置只有一个关键点

【问题讨论】:

【参考方案1】:

我自己找到了解决方案。关键点没有确定,因此每个箱都将适合图像,但只有它是中心。引用documentation:

关键点的采样方式使得空间中心 bin 位于图像边界内的整数坐标处。为了 例如,左上角描述符的左上角 bin 以 像素 (0,0)。在 (binSizeX,0) 处右侧的 bin, 其中 binSizeX 是 VlDsiftDescriptorGeometry 中的一个参数 结构。

所以(0,0) 是左上角 bin 的坐标(近似值的中心是(2,2))。考虑到 DSIFT 行为,其余部分很明显。

【讨论】:

以上是关于为啥 Dense SIFT 会产生这些关键点?的主要内容,如果未能解决你的问题,请参考以下文章

SIFT特征提取分析

SIFT特征提取分析

SIFT特征提取分析

为啥 SIFT 描述符是尺度不变的?

SIFT特征

使用SIFT搜索图像数据库