int run_video_mode(const Configuration &cfg, const CommandLineArgument<std::string> &image_argument, const CommandLineArgument<std::string> &landmarks_argument) { FaceTracker *tracker = LoadFaceTracker(cfg.model_pathname.c_str()); FaceTrackerParams *tracker_params = LoadFaceTrackerParams(cfg.params_pathname.c_str()); assert(tracker); assert(tracker_params); cv::VideoCapture input(image_argument->c_str()); if (!input.isOpened()) throw make_runtime_error("Unable to open video file '%s'", image_argument->c_str()); cv::Mat image; std::vector<char> pathname_buffer; pathname_buffer.resize(1000); input >> image; int frame_number = 1; while ((image.rows > 0) && (image.cols > 0)) { if (cfg.verbose) { printf(" Frame number %d\r", frame_number); fflush(stdout); } cv::Mat_<uint8_t> gray_image; if (image.type() == cv::DataType<cv::Vec<uint8_t,3> >::type) cv::cvtColor(image, gray_image, CV_BGR2GRAY); else if (image.type() == cv::DataType<uint8_t>::type) gray_image = image; else throw make_runtime_error("Do not know how to convert video frame to a grayscale image."); int result = tracker->Track(gray_image, tracker_params); std::vector<cv::Point_<double> > shape; std::vector<cv::Point3_<double> > shape3D; Pose pose; if (result >= cfg.tracking_threshold) { shape = tracker->getShape(); shape3D = tracker->get3DShape(); pose = tracker->getPose(); } else { tracker->Reset(); } if (!have_argument_p(landmarks_argument)) { display_data(cfg, image, shape, pose); } else if (shape.size() > 0) { snprintf(pathname_buffer.data(), pathname_buffer.size(), landmarks_argument->c_str(), frame_number); if (cfg.save_3d_points) save_points3(pathname_buffer.data(), shape3D); else save_points(pathname_buffer.data(), shape); if (cfg.verbose) display_data(cfg, image, shape, pose); } else if (cfg.verbose) { display_data(cfg, image, shape, pose); } input >> image; frame_number++; } delete tracker; delete tracker_params; return 0; }