#include <boost/filesystem.hpp>
#include <iostream>
#include <fstream>
namespace fs = boost::filesystem;
std::vector< std::shared_ptr<face_sdk::video_frame> > load_frames(const std::string &directory, uint32_t max_frames = std::numeric_limits<uint32_t>::max())
{
int32_t fps = 0;
{
fs::path fps_file_path = fs::path(directory) / "fps";
std::ifstream stream;
stream.exceptions(std::ios::badbit | std::ios::failbit);
stream.open(fps_file_path.string());
stream >> fps;
}
std::vector< std::shared_ptr<face_sdk::video_frame> > frames;
auto dir_it = fs::directory_iterator(fs::path(directory));
while (dir_it != fs::directory_iterator()) {
auto entry = *dir_it;
if (fs::extension(entry.path()) == ".jpg") {
uint32_t frame_id = std::stol(entry.path().filename().string());
frames.push_back(frame);
if (max_frames <= frames.size()) {
break;
}
}
dir_it++;
}
std::sort(
frames.begin(),
frames.end(),
[](const std::shared_ptr<face_sdk::video_frame> &f, const std::shared_ptr<face_sdk::video_frame> f1) -> bool { return f->frame_id() < f1->frame_id(); });
return frames;
}
{
public:
const std::shared_ptr<face_sdk::video_stream>& stream,
const std::shared_ptr<face_sdk::track>& track,
const std::shared_ptr<face_sdk::video_frame>& frame,
const std::shared_ptr<face_sdk::face>& face) override
{
std::cout << "--- on_track_appeared ---" << std::endl;
std::cout << " stream_id = " << stream->stream_id() << std::endl;
std::cout << " track_id = " << track->track_id() << std::endl;
std::cout << " frame = " << frame->frame_id() << std::endl;
std::cout << " face = [ x = " << face->x()
<< ", y = " << face->y()
<< ", width = " << face->width()
<< ", height " << face->height()
<< "]" << std::endl << std::endl;
}
const std::shared_ptr<face_sdk::video_stream>& stream,
const std::shared_ptr<face_sdk::track>& track) override
{
std::cout << "--- on_track_disappeared ---" << std::endl;
std::cout << " stream_id = " << stream->stream_id() << std::endl;
std::cout << " track_id = " << track->track_id() << std::endl << std::endl;
}
const std::shared_ptr<face_sdk::video_stream>& stream,
const std::shared_ptr<face_sdk::track>& track,
const std::shared_ptr<face_sdk::video_frame>& frame,
const std::shared_ptr<face_sdk::face>& face) override
{
std::cout << "--- on_track_updated ---" << std::endl;
std::cout << " stream_id = " << stream->stream_id() << std::endl;
std::cout << " track_id = " << track->track_id() << std::endl;
std::cout << " frame = " << frame->frame_id() << std::endl;
std::cout << " face = [ x = " << face->x()
<< ", y = " << face->y()
<< ", width = " << face->width()
<< ", height " << face->height()
<< "]" << std::endl << std::endl;
}
void on_track_best_frame(const std::shared_ptr<face_sdk::video_stream> &stream, const std::shared_ptr<face_sdk::track> &track, const std::shared_ptr<face_sdk::video_frame> &frame, const std::shared_ptr<face_sdk::face> &face) override
{
std::cout << "--- on_track_best_frame ---" << std::endl;
std::cout << " stream_id = " << stream->stream_id() << std::endl;
std::cout << " track_id = " << track->track_id() << std::endl;
std::cout << " frame = " << frame->frame_id() << std::endl;
std::cout << " face = [ x = " << face->x()
<< ", y = " << face->y()
<< ", width = " << face->width()
<< ", height " << face->height()
<< "]" << std::endl << std::endl;
}
};
int main(int argc, char **argv)
{
std::shared_ptr<face_sdk::tracker> tracker = nullptr;
std::shared_ptr<events_handler> handler = std::make_shared<events_handler>();
try {
}
std::cerr << face_sdk::format_exception(exp) << std::endl;
try {
std::rethrow_if_nested(exp);
}
catch (const face_sdk::version_not_available_exception &nested) {
std::cerr << nested.what() << std::endl;
}
catch (const face_sdk::license_exception &nested) {
std::cerr << nested.what() << std::endl;
}
catch (const std::exception &nested) {
std::cerr << nested.what() << std::endl;
}
return 1;
}
std::shared_ptr<face_sdk::video_stream> stream = tracker->make_stream(0);
auto frames = load_frames(std::string(argv[1]));
for (auto frame : frames) {
try {
stream->push_frame(frame);
tracker->commit_frames();
}
std::cerr << face_sdk::format_exception(exp) << std::endl;
try {
std::rethrow_if_nested(exp);
}
catch (const face_sdk::version_not_available_exception &nested) {
std::cerr << nested.what() << std::endl;
}
catch (const face_sdk::license_exception &nested) {
std::cerr << nested.what() << std::endl;
}
catch (const std::exception &nested) {
std::cerr << nested.what() << std::endl;
}
tracker->free_stream(stream);
return 2;
}
}
tracker->free_stream(stream);
return 0;
}