为啥 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 会产生这些关键点?的主要内容,如果未能解决你的问题,请参考以下文章