Алгоритм 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, но если у вас есть вопросы, не стесняйтесь задавать их на форумах.