Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // -------------------------
- // OpenPose C++ API Tutorial - Example 6 - Custom Input
- // -------------------------
- // Asynchronous mode:
- // ideal for fast prototyping when performance
- // is not an issue. In this function, the user
- // can implement its own way to create frames (e.g.,
- // reading his own folder of images) and
- // emplaces/pushes the frames to OpenPose.
- // Command-line user intraface
- #define OPENPOSE_FLAGS_DISABLE_PRODUCER
- // OpenPose headers
- #include <openpose/flags.hpp>
- #include <openpose/headers.hpp>
- // The W-classes can be implemented either as
- // a template or as simple classes given that
- // the user usually knows which kind of data
- // he will move between the queues, in this
- // case we assume a std::shared_ptr of a
- // std::vector of op::Datum
- // OpenPose image_dir
- DEFINE_string(image_dir, "/home/ravi/tools/openpose/examples/media/", "");
- // OpenPose model_folder
- DEFINE_string(model_folder, "/home/ravi/tools/openpose/models/", "");
- class UserInputClass
- {
- public:
- UserInputClass(const std::string& directoryPath)
- : mImageFiles{ op::getFilesOnDirectory(directoryPath,
- op::Extensions::Images) }
- , // For all basic image formats
- // If we want only e.g., "jpg" + "png" images
- // mImageFiles{op::getFilesOnDirectory(directoryPath,
- // std::vector<std::string>{"jpg", "png"})},
- mCounter{ 0 }
- , mClosed{ false }
- {
- if (mImageFiles.empty())
- op::error("No images found on: " + directoryPath, __LINE__, __FUNCTION__,
- __FILE__);
- }
- std::shared_ptr<std::vector<std::shared_ptr<op::Datum>>> createDatum()
- {
- // Close program when empty frame
- if (mClosed || mImageFiles.size() <= mCounter)
- {
- op::log("Last frame read and added to queue. Closing program after it is "
- "processed.",
- op::Priority::High);
- // This funtion stops this worker, which will eventually stop the whole
- // thread system once all the frames
- // have been processed
- mClosed = true;
- return nullptr;
- }
- else // if (!mClosed)
- {
- // Create new datum
- auto datumsPtr =
- std::make_shared<std::vector<std::shared_ptr<op::Datum>>>();
- datumsPtr->emplace_back();
- auto& datumPtr = datumsPtr->at(0);
- datumPtr = std::make_shared<op::Datum>();
- // Fill datum
- datumPtr->cvInputData = cv::imread(mImageFiles.at(mCounter++));
- // If empty frame -> return nullptr
- if (datumPtr->cvInputData.empty())
- {
- op::log("Empty frame detected on path: " +
- mImageFiles.at(mCounter - 1) + ". Closing program.",
- op::Priority::High);
- mClosed = true;
- datumsPtr = nullptr;
- }
- return datumsPtr;
- }
- }
- bool isFinished() const
- {
- return mClosed;
- }
- private:
- const std::vector<std::string> mImageFiles;
- unsigned long long mCounter;
- bool mClosed;
- };
- void configureWrapper(op::Wrapper& opWrapper)
- {
- try
- {
- // Configuring OpenPose
- // logging_level
- op::check(0 <= FLAGS_logging_level && FLAGS_logging_level <= 255,
- "Wrong logging_level value.", __LINE__, __FUNCTION__, __FILE__);
- op::ConfigureLog::setPriorityThreshold((op::Priority)FLAGS_logging_level);
- op::Profiler::setDefaultX(FLAGS_profile_speed);
- // Applying user defined configuration - GFlags to program variables
- // outputSize
- const auto outputSize = op::flagsToPoint(FLAGS_output_resolution, "-1x-1");
- // netInputSize
- const auto netInputSize = op::flagsToPoint(FLAGS_net_resolution, "-1x368");
- // faceNetInputSize
- const auto faceNetInputSize = op::flagsToPoint(FLAGS_face_net_resolution,
- "368x368 (multiples of 16)");
- // handNetInputSize
- const auto handNetInputSize = op::flagsToPoint(FLAGS_hand_net_resolution,
- "368x368 (multiples of 16)");
- // poseModel
- const auto poseModel = op::flagsToPoseModel(FLAGS_model_pose);
- // JSON saving
- if (!FLAGS_write_keypoint.empty())
- op::log(
- "Flag `write_keypoint` is deprecated and will eventually be removed."
- " Please, use `write_json` instead.",
- op::Priority::Max);
- // keypointScaleMode
- const auto keypointScaleMode = op::flagsToScaleMode(FLAGS_keypoint_scale);
- // heatmaps to add
- const auto heatMapTypes =
- op::flagsToHeatMaps(FLAGS_heatmaps_add_parts, FLAGS_heatmaps_add_bkg,
- FLAGS_heatmaps_add_PAFs);
- const auto heatMapScaleMode =
- op::flagsToHeatMapScaleMode(FLAGS_heatmaps_scale);
- // >1 camera view?
- const auto multipleView = (FLAGS_3d || FLAGS_3d_views > 1);
- // Face and hand detectors
- const auto faceDetector = op::flagsToDetector(FLAGS_face_detector);
- const auto handDetector = op::flagsToDetector(FLAGS_hand_detector);
- // Enabling Google Logging
- const bool enableGoogleLogging = true;
- // Pose configuration (use WrapperStructPose{} for default and recommended
- // configuration)
- const op::WrapperStructPose wrapperStructPose{
- !FLAGS_body_disable,
- netInputSize,
- outputSize,
- keypointScaleMode,
- FLAGS_num_gpu,
- FLAGS_num_gpu_start,
- FLAGS_scale_number,
- (float)FLAGS_scale_gap,
- op::flagsToRenderMode(FLAGS_render_pose, multipleView),
- poseModel,
- !FLAGS_disable_blending,
- (float)FLAGS_alpha_pose,
- (float)FLAGS_alpha_heatmap,
- FLAGS_part_to_show,
- FLAGS_model_folder,
- heatMapTypes,
- heatMapScaleMode,
- FLAGS_part_candidates,
- (float)FLAGS_render_threshold,
- FLAGS_number_people_max,
- FLAGS_maximize_positives,
- FLAGS_fps_max,
- FLAGS_prototxt_path,
- FLAGS_caffemodel_path,
- enableGoogleLogging
- };
- opWrapper.configure(wrapperStructPose);
- // Face configuration (use op::WrapperStructFace{} to disable it)
- const op::WrapperStructFace wrapperStructFace{
- FLAGS_face,
- faceDetector,
- faceNetInputSize,
- op::flagsToRenderMode(FLAGS_face_render, multipleView, FLAGS_render_pose),
- (float)FLAGS_face_alpha_pose,
- (float)FLAGS_face_alpha_heatmap,
- (float)FLAGS_face_render_threshold
- };
- opWrapper.configure(wrapperStructFace);
- // Hand configuration (use op::WrapperStructHand{} to disable it)
- const op::WrapperStructHand wrapperStructHand{
- FLAGS_hand,
- handDetector,
- handNetInputSize,
- FLAGS_hand_scale_number,
- (float)FLAGS_hand_scale_range,
- op::flagsToRenderMode(FLAGS_hand_render, multipleView, FLAGS_render_pose),
- (float)FLAGS_hand_alpha_pose,
- (float)FLAGS_hand_alpha_heatmap,
- (float)FLAGS_hand_render_threshold
- };
- opWrapper.configure(wrapperStructHand);
- // Extra functionality configuration (use op::WrapperStructExtra{} to
- // disable it)
- const op::WrapperStructExtra wrapperStructExtra{
- FLAGS_3d, FLAGS_3d_min_views, FLAGS_identification, FLAGS_tracking,
- FLAGS_ik_threads
- };
- opWrapper.configure(wrapperStructExtra);
- // Output (comment or use default argument to disable any output)
- const op::WrapperStructOutput wrapperStructOutput{
- FLAGS_cli_verbose,
- FLAGS_write_keypoint,
- op::stringToDataFormat(FLAGS_write_keypoint_format),
- FLAGS_write_json,
- FLAGS_write_coco_json,
- FLAGS_write_coco_foot_json,
- FLAGS_write_coco_json_variant,
- FLAGS_write_images,
- FLAGS_write_images_format,
- FLAGS_write_video,
- FLAGS_write_video_fps,
- FLAGS_write_video_with_audio,
- FLAGS_write_heatmaps,
- FLAGS_write_heatmaps_format,
- FLAGS_write_video_3d,
- FLAGS_write_video_adam,
- FLAGS_write_bvh,
- FLAGS_udp_host,
- FLAGS_udp_port
- };
- opWrapper.configure(wrapperStructOutput);
- // GUI (comment or use default argument to disable any visual output)
- const op::WrapperStructGui wrapperStructGui{
- op::flagsToDisplayMode(FLAGS_display, FLAGS_3d), !FLAGS_no_gui_verbose,
- FLAGS_fullscreen
- };
- opWrapper.configure(wrapperStructGui);
- // Set to single-thread (for sequential processing and/or debugging and/or
- // reducing latency)
- if (FLAGS_disable_multi_thread)
- opWrapper.disableMultiThreading();
- }
- catch (const std::exception& e)
- {
- op::error(e.what(), __LINE__, __FUNCTION__, __FILE__);
- }
- }
- int tutorialApiCpp()
- {
- try
- {
- op::log("Starting OpenPose demo...", op::Priority::High);
- const auto opTimer = op::getTimerInit();
- // Configuring OpenPose
- op::log("Configuring OpenPose...", op::Priority::High);
- op::Wrapper opWrapper{ op::ThreadManagerMode::AsynchronousIn };
- configureWrapper(opWrapper);
- // Start, run, and stop processing - exec() blocks this thread until
- // OpenPose wrapper has finished
- op::log("Starting thread(s)...", op::Priority::High);
- opWrapper.start();
- // User processing
- UserInputClass userInputClass(FLAGS_image_dir);
- bool userWantsToExit = false;
- while (!userWantsToExit && !userInputClass.isFinished())
- {
- // Push frame
- auto datumToProcess = userInputClass.createDatum();
- if (datumToProcess != nullptr)
- {
- auto successfullyEmplaced = opWrapper.waitAndEmplace(datumToProcess);
- if (!successfullyEmplaced)
- op::log("Processed datum could not be emplaced.", op::Priority::High);
- }
- }
- op::log("Stopping thread(s)", op::Priority::High);
- opWrapper.stop();
- // Measuring total time
- op::printTime(opTimer, "OpenPose demo successfully finished. Total time: ",
- " seconds.", op::Priority::High);
- // Return
- return 0;
- }
- catch (const std::exception& e)
- {
- return -1;
- }
- }
- int main(int argc, char* argv[])
- {
- // Parsing command line flags
- gflags::ParseCommandLineFlags(&argc, &argv, true);
- // Running tutorialApiCpp
- return tutorialApiCpp();
- }
Advertisement
Add Comment
Please, Sign In to add comment