如何使用 vlfeat 和 opencv 确定 C++ 中图像的 PHOW 特征?
Posted
技术标签:
【中文标题】如何使用 vlfeat 和 opencv 确定 C++ 中图像的 PHOW 特征?【英文标题】:How to determine PHOW features for an image in C++ with vlfeat and opencv? 【发布时间】:2015-07-01 15:30:40 【问题描述】:我在matlab中实现了一个PHOW特征检测器,如下:
[frames, descrs] = vl_phow(im);
它是代码的包装器:
...
for i = 1:4
ims = vl_imsmooth(im, scales(i) / 3) ;
[framess, descrss] = vl_dsift(ims, 'Fast', 'Step', step, 'Size', scales(i)) ;
end
...
我正在使用 opencv 和 vlfeat 用 c++ 进行实现。这是我的实现代码的一部分,用于计算图像(Mat 图像)的 PHOW 特征:
...
//convert into float array
float* img_vec = im2single(image);
//create filter
VlDsiftFilter* vlf = vl_dsift_new(image.cols, image.rows);
double bin_sizes[] = 3, 4, 5, 6 ;
double magnif = 3;
double* scales = (double*)malloc(4*sizeof(double));
for (size_t i = 0; i < 4; i++)
scales[i] = bin_sizes[i] / magnif;
for (size_t i = 0; i < 4; i++)
double sigma = sqrt(pow(scales[i], 2) - 0.25);
//smooth float array image
float* img_vec_smooth = (float*)malloc(image.rows*image.cols*sizeof(float));
vl_imsmooth_f(img_vec_smooth, image.cols, img_vec, image.cols, image.rows, image.cols, sigma, sigma);
//run DSIFT
vl_dsift_process(vlf, img_vec_smooth);
//number of keypoints found
int keypoints_num = vl_dsift_get_keypoint_num(vlf);
//extract keypoints
const VlDsiftKeypoint* vlkeypoints = vl_dsift_get_keypoints(vlf);
//descriptors dimention
int dim = vl_dsift_get_descriptor_size(vlf);
//extract descriptors
const float* descriptors = vl_dsift_get_descriptors(vlf);
...
//return all descriptors of diferent scales
我不确定返回是否应该是所有尺度的所有描述符的集合,这在我们处理多个图像时需要大量存储空间;或不同尺度的描述符之间的运算结果。 你能帮我解决这个疑问吗? 谢谢
【问题讨论】:
【参考方案1】:你可以做任何一个。最简单的方法是简单地连接不同的级别。我相信这就是 VLFeat 所做的(至少他们没有说他们在文档中做了更多的事情)。删除低于对比度阈值的那些应该会有所帮助,但你仍然会有几千个(取决于图像的大小)。但是您可以比较出现在同一位置附近的描述符以删减一些。它有点时空权衡。一般来说,我已经看到 bin 大小的间隔(间隔为 2,但可能更多),这应该减少检查重叠描述符的需要。
【讨论】:
作为我自己的一个问题,为什么smoothedStride
和stride
参数选择image.cols
到vl_imsmooth_f()
?我一直在试图弄清楚它们到底做了什么,但是源代码相当混乱......以上是关于如何使用 vlfeat 和 opencv 确定 C++ 中图像的 PHOW 特征?的主要内容,如果未能解决你的问题,请参考以下文章