为什么Dense SIFT产生这些关键点?

时间:2017-01-10 18:22:22

标签: opencv computer-vision sift vlfeat

我正在尝试使用VLFeat documentationAPI了解Dense SIFT的工作原理。我正在测试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箱,并且每个箱的大小为4px,我们的窗口是16x16箱的整个图像。只需使用此图片(取自here)作为参考:

enter image description here

关键点位置应位于图像的完美中心,因此一个以下选项(假设索引从0开始):

  • 7x7的
  • 7x8
  • 8×7
  • 8×8

(取决于实施)

相反,这是输出(对于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 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。关键点没有确定,所以每个箱子都适合图像,但只有它的中心。引用documentation

  

关键点的采样方式是空间的中心   箱位于图像边界内的整数坐标处。对于   例如,左上角描述符的左上角区域以中心为中心   像素(0,0)。紧靠bin(binSizeX,0)右边的bin,   其中binSizeX是VlDsiftDescriptorGeometry中的参数   结构

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