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