如何使用 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,但可能更多),这应该减少检查重叠描述符的需要。

【讨论】:

作为我自己的一个问题,为什么smoothedStridestride参数选择image.colsvl_imsmooth_f()?我一直在试图弄清楚它们到底做了什么,但是源代码相当混乱......

以上是关于如何使用 vlfeat 和 opencv 确定 C++ 中图像的 PHOW 特征?的主要内容,如果未能解决你的问题,请参考以下文章

记录一下vlfeat视觉库配置

tensorflow 机器学习资料及其工具库

使用 vlfeat 时是不是必须显式释放内存?

如何在 Octave 上设置 VLFEAT?

SVM:如何在 vlfeat 中使用 chi2 内核

matlab - vlfeat - vl_pegasos (svm) 分类