我正在尝试使用VLFeat documentation和API了解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)作为参考:
关键点位置应位于图像的完美中心,因此一个以下选项(假设索引从0开始):
(取决于实施)
相反,这是输出(对于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
答案 0 :(得分:0)
我自己找到了解决方案。关键点没有确定,所以每个箱子都适合图像,但只有它的中心。引用documentation:
关键点的采样方式是空间的中心 箱位于图像边界内的整数坐标处。对于 例如,左上角描述符的左上角区域以中心为中心 像素(0,0)。紧靠bin(binSizeX,0)右边的bin, 其中binSizeX是VlDsiftDescriptorGeometry中的参数 结构
所以(0,0)
是左上角的坐标(中心为(2,2)
近似)。考虑到DSIFT行为,其余部分显而易见。