Как лучше всего найти SURF-функции только на измененных участках кадра?
Например, я вычисляю дескрипторы SURF для кадров из видео FullHD со скоростью 50 кадров в секунду в режиме реального времени, используя графический процессор: gpu::SURF_GPU
Но это медленно, и я не могу рассчитать его для каждого кадра, только для 10 кадров в секунду.
Видеокамера неподвижна и фиксирована, поэтому я могу использовать следующую оптимизацию - вычислять дескрипторы только по измененным областям кадра. я использую gpu::MOG2_GPU
фоновый вычитатель, получить маску переднего плана и пересчитать дескрипторы SURF только для пересечения mask & frame
, Это намного быстрее.
gpu::GpuMat frame, mask;
gpu::MOG2_GPU mog2GPU;
mog2GPU(frame, mask);
// do I need to do this?
/*
gpu::GpuMat frame_src = frame.clone();
int const dilation_size = 30;
Mat element_dilate = getStructuringElement(MORPH_ELLIPSE, // MORPH_RECT, MORPH_CROSS,
Size(2 * dilation_size + 1, 2 * dilation_size + 1),
Point(dilation_size, dilation_size))
gpu::dilate(frame_src, frame, element_dilate);
*/
gpu::SURF_GPU surfGPU;
surfGPU(frame, mask, keypoints, descriptors);
Достаточно ли этого, или необходимо увеличить зону маскирования, используя gpu::dilate()
?
И если мне нужно сделать это, то сколько пикселей используется для вычисления каждого дескриптора SURF - т.е. какое значение мне нужно передать в функцию gpu::dilate()
как kernel
а также dilation_size
?