ROC SDK  2.4.0
Scalable Face Recognition Software
roc_example_track.c

Source code for examples/roc_example_track.c.

/*
* This example application takes as input a video path and processes frames at
* a specified rate.
*
* To compile this example on OS X / Linux (bash):
*
* $ gcc -o roc-example-track roc_example_track.c -I ../include/ -L ../lib/ -lroc -Wl,-rpath,'$ORIGIN/../lib:../lib' -lroc_video
*
* To compile this example on Windows (Visual Studio Command Prompt):
*
* $ cl roc_example_track.c /TP /I ../include/ ../lib/roc.lib ../lib/roc_video.lib /Feroc-example-track.exe
*
* To run this application using an example image:
*
* $ ./roc-example-track ../data/presidents.mp4
*/
#include <stdio.h>
#include <stdlib.h>
#include "roc.h"
int main(int argc, char *argv[])
{
roc_video video;
roc_video_metadata video_metadata;
roc_tracker frame_tracker, person_counter;
roc_stream stream;
float fps;
if (argc != 2)
roc_ensure("Expected one argument:\n"
" $ roc-example-track path/to/video.mp4");
// Initialize SDK
roc_ensure(roc_initialize(NULL, NULL));
// Open the video
roc_ensure(roc_open_video(argv[1], ROC_BGR24, &video, &video_metadata));
printf("Video Duration: %zu ms\n", video_metadata.duration);
// Initialize two trackers...
// ...the first to track faces between frames
roc_ensure(roc_new_tracker(&frame_tracker));
// ...the second to count persons each time they are seen
roc_ensure(roc_new_tracker(&person_counter));
// Start streaming frames into the frame tracker
roc_ensure(roc_stream_start(&stream, 5, 4));
roc_ensure(roc_stream_set_image_callback(stream, NULL, frame_tracker));
// Handle events until the video is done processing
while (stream) {
if (roc_stream_is_paused(stream)) {
// Finalize any remaining tracks
// Print observed processing speed
printf("Stream processing speed (frames per second): %f\n", fps);
// Flag an exit of the main loop
}
while (roc_tracker_has_events(frame_tracker, 100)) {
roc_event event;
roc_ensure(roc_tracker_take_event(frame_tracker, &event));
if (event.reasons & ROC_NEW_TRACK) {
roc_ensure(roc_tracker_add_template(person_counter, event.probe));
while (roc_tracker_has_events(person_counter, 0)) {
roc_event person_event;
roc_ensure(roc_tracker_take_event(person_counter, &person_event));
const roc_uuid_string uuid_string = roc_uuid_to_string(person_event.probe.person_id);
printf("Person %s seen %d time(s)\n", uuid_string.data, person_event.count);
}
}
}
}
// Cleanup
roc_ensure(roc_free_tracker(frame_tracker));
roc_ensure(roc_free_tracker(person_counter));
return EXIT_SUCCESS;
}