如何使用 vlfeat 和 opencv 在 C++ 中确定图像的 PHOW 特征?

How to determine PHOW features for an image in C++ with vlfeat and opencv?

我在matlab中实现了一个PHOW特征检测器,如下:

    [frames, descrs] = vl_phow(im);

这是代码的包装器:

    ...
    for i = 1:4
        ims = vl_imsmooth(im, scales(i) / 3) ;
        [frames{s}, descrs{s}] = 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

我不确定 return 是否应该是所有尺度的所有描述符的集合,当我们处理多个图像时需要大量存储 space;或不同尺度的描述符之间的操作结果。 你能帮我解决这个疑问吗? 谢谢

你可以做任何一个。最简单的是简单地连接不同的级别。我相信这就是 VLFeat 所做的(至少他们没有说他们在文档中做了更多的事情)。删除低于对比度阈值的那些应该会有所帮助,但您仍然会有几千个(取决于图像的大小)。但是您可以比较同一位置附近发生的描述符以删减一些。有点时间-space权衡。一般来说,我已经看到 bin 大小 spaced(间隔为 2,但可能更多)这应该减少检查重叠描述符的需要。