я реализовал детектор особенности PHOW в MATLAB, следующим образом:Как определить функции PHOW для изображения на C++ с помощью vlfeat и opencv?
[frames, descrs] = vl_phow(im);
который является wraper к коду:
...
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
...
Я делаю реализацию в C++ с OpenCV и vlfeat. Это часть моего кода реализации для вычисления функции PHOW для изображения (Mat изображения):
...
//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
Я не уверен, если возвращение должно быть множеством всех дескрипторов для всех масштабов, что требует много когда мы обрабатываем несколько изображений; или результат операции между дескрипторами разных масштабов. Можете ли вы помочь мне с этим сомнением? Спасибо
Как вопрос, почему выбор 'image.cols' для параметров' smoothedStride' и 'stride' для' vl_imsmooth_f() '? Я пытался выяснить, что именно они делают, но исходный код довольно запутанный ... – brian