1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
- // ------------------------------------------------ OpenPose C++ Demo ------------------------------------------------
- // This example summarizes all the functionality of the OpenPose library. It can...
- // 1. Read a frames source (images, video, webcam, 3D stereo Flir cameras, etc.).
- // 2. Extract and render body/hand/face/foot keypoint/heatmap/PAF of that image.
- // 3. Save the results on disk.
- // 4. Display the rendered pose.
- // If the user wants to learn to use the OpenPose C++ library, we highly recommend to start with the examples in
- // `examples/tutorial_api_cpp/`.
- // Command-line user interface
- #include <openpose/flags.hpp>
- // OpenPose dependencies
- #include <openpose/headers.hpp>
- void configureWrapper(op::Wrapper& opWrapper)
- {
- try
- {
- // Configuring OpenPose
- // logging_level
- op::checkBool(
- 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
- // producerType
- op::ProducerType producerType;
- op::String producerString;
- std::tie(producerType, producerString) = op::flagsToProducer(
- op::String(FLAGS_image_dir), op::String(FLAGS_video), op::String(FLAGS_ip_camera), FLAGS_camera,
- FLAGS_flir_camera, FLAGS_flir_camera_index);
- // cameraSize
- const auto cameraSize = op::flagsToPoint(op::String(FLAGS_camera_resolution), "-1x-1");
- // outputSize
- const auto outputSize = op::flagsToPoint(op::String(FLAGS_output_resolution), "-1x-1");
- // netInputSize
- const auto netInputSize = op::flagsToPoint(op::String(FLAGS_net_resolution), "-1x368");
- // faceNetInputSize
- const auto faceNetInputSize = op::flagsToPoint(op::String(FLAGS_face_net_resolution), "368x368 (multiples of 16)");
- // handNetInputSize
- const auto handNetInputSize = op::flagsToPoint(op::String(FLAGS_hand_net_resolution), "368x368 (multiples of 16)");
- // poseMode
- const auto poseMode = op::flagsToPoseMode(FLAGS_body);
- // poseModel
- const auto poseModel = op::flagsToPoseModel(op::String(FLAGS_model_pose));
- // JSON saving
- if (!FLAGS_write_keypoint.empty())
- op::opLog(
- "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 || FLAGS_flir_camera);
- // 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{
- poseMode, 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, op::String(FLAGS_model_folder), heatMapTypes, heatMapScaleMode, FLAGS_part_candidates,
- (float)FLAGS_render_threshold, FLAGS_number_people_max, FLAGS_maximize_positives, FLAGS_fps_max,
- op::String(FLAGS_prototxt_path), op::String(FLAGS_caffemodel_path),
- (float)FLAGS_upsampling_ratio, 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);
- // Producer (use default to disable any input)
- const op::WrapperStructInput wrapperStructInput{
- producerType, producerString, FLAGS_frame_first, FLAGS_frame_step, FLAGS_frame_last,
- FLAGS_process_real_time, FLAGS_frame_flip, FLAGS_frame_rotate, FLAGS_frames_repeat,
- cameraSize, op::String(FLAGS_camera_parameter_path), FLAGS_frame_undistort, FLAGS_3d_views};
- opWrapper.configure(wrapperStructInput);
- // Output (comment or use default argument to disable any output)
- const op::WrapperStructOutput wrapperStructOutput{
- FLAGS_cli_verbose, op::String(FLAGS_write_keypoint), op::stringToDataFormat(FLAGS_write_keypoint_format),
- op::String(FLAGS_write_json), op::String(FLAGS_write_coco_json), FLAGS_write_coco_json_variants,
- FLAGS_write_coco_json_variant, op::String(FLAGS_write_images), op::String(FLAGS_write_images_format),
- op::String(FLAGS_write_video), FLAGS_write_video_fps, FLAGS_write_video_with_audio,
- op::String(FLAGS_write_heatmaps), op::String(FLAGS_write_heatmaps_format), op::String(FLAGS_write_video_3d),
- op::String(FLAGS_write_video_adam), op::String(FLAGS_write_bvh), op::String(FLAGS_udp_host),
- op::String(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 openPoseDemo()
- {
- try
- {
- op::opLog("Starting OpenPose demo...", op::Priority::High);
- const auto opTimer = op::getTimerInit();
- // Configure OpenPose
- op::opLog("Configuring OpenPose...", op::Priority::High);
- op::Wrapper opWrapper;
- configureWrapper(opWrapper);
- // Start, run, and stop processing - exec() blocks this thread until OpenPose wrapper has finished
- op::opLog("Starting thread(s)...", op::Priority::High);
- opWrapper.exec();
- // Measuring total time
- op::printTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", op::Priority::High);
- // Return successful message
- return 0;
- }
- catch (const std::exception&)
- {
- return -1;
- }
- }
- int main(int argc, char *argv[])
- {
- // Parsing command line flags
- gflags::ParseCommandLineFlags(&argc, &argv, true);
- // Running openPoseDemo
- return openPoseDemo();
- }
|