Как лучше всего найти 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?

0 ответов

Другие вопросы по тегам