Алгоритм Multi-Track#

Multi-track — это простой алгоритм отслеживания нескольких объектов для CMUcam3, разработанный Стивом Шерманом для доктора Дерека Пейли в лаборатории Collective Dynamics and Control Lab Мэрилендского университета в Колледж-Парке. Суть алгоритма заключается в вызове простого отслеживания цвета на небольших участках кадра изображения с последующим объединением возвращённых ограничивающих рамок для получения списка найденных объектов.

На типичном трёхканальном изображении полного разрешения выполнение multitrack занимает около 450 мс. Для сравнения: 300 мс для simple_color_track и 200 мс для базового поиска ярких пикселей. На одноканальном изображении полного разрешения multitrack занимает ~340 мс, простое отслеживание цвета ~200 мс, а поиск ярких пикселей примерно 150 мс. Уверен, что можно сделать множество оптимизаций, так что не стесняйтесь дорабатывать и улучшать алгоритм.

Пример вызова multitrack:

multitrack_pkt_t tracker;
cc3_pixbuf_load();  //takes picture
multitrack(&tracker);

//make sure to free the memory after you are done to prevent a memory leak
free(tracker.objects);

tracker.entries=0;

Каждый multitrack_pkt_t определяется следующим образом:

typedef struct {

  uint8_t entries; // the number of objects

  cc3_track_pkt_t* objects;//pointer to the array of objects
  cc3_track_pkt_t base; //the reference color data

  uint8_t divh; //number of rows of blocks

  uint8_t divw; //number of columns of blocks

  uint16_t tolerance; //max distance track_pkts must be to merge

  uint8_t minpix; // minimum number of pixels to not be filtered

  uint8_t mindensity; //minimum density to not be filtered

  uint8_t minwidth; //minimum dimension of a track pkt

} multitrack_pkt_t;

Дополнительную документацию можно найти в исходном коде, а также в образце файла main, но если у вас есть вопросы, не стесняйтесь задавать их на форумах.