OpenPose  1.0.0rc2
OpenPose: A Real-Time Multi-Person Key-Point Detection And Multi-Threading C++ Library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
wrapper.hpp
Go to the documentation of this file.
1 #ifndef OPENPOSE_WRAPPER_WRAPPER_HPP
2 #define OPENPOSE_WRAPPER_WRAPPER_HPP
3 
13 
14 namespace op
15 {
31  template<typename TDatums = std::vector<Datum>,
32  typename TDatumsSP = std::shared_ptr<TDatums>,
33  typename TWorker = std::shared_ptr<Worker<TDatumsSP>>>
34  class WrapperT
35  {
36  public:
44  explicit WrapperT(const ThreadManagerMode threadManagerMode = ThreadManagerMode::Synchronous);
45 
50  virtual ~WrapperT();
51 
57  void disableMultiThreading();
58 
66  void setWorker(const WorkerType workerType, const TWorker& worker, const bool workerOnNewThread = true);
67 
71  void configure(const WrapperStructPose& wrapperStructPose);
72 
76  void configure(const WrapperStructFace& wrapperStructFace);
77 
81  void configure(const WrapperStructHand& wrapperStructHand);
82 
86  void configure(const WrapperStructExtra& wrapperStructExtra);
87 
91  void configure(const WrapperStructInput& wrapperStructInput);
92 
96  void configure(const WrapperStructOutput& wrapperStructOutput);
97 
103  void exec();
104 
114  void start();
115 
120  void stop();
121 
127  bool isRunning() const;
128 
136  bool tryEmplace(TDatumsSP& tDatums);
137 
146  bool waitAndEmplace(TDatumsSP& tDatums);
147 
154  bool tryPush(const TDatumsSP& tDatums);
155 
162  bool waitAndPush(const TDatumsSP& tDatums);
163 
171  bool tryPop(TDatumsSP& tDatums);
172 
181  bool waitAndPop(TDatumsSP& tDatums);
182 
186  bool emplaceAndPop(TDatumsSP& tDatums);
187 
191  TDatumsSP emplaceAndPop(const cv::Mat& cvMat);
192 
193  private:
194  const ThreadManagerMode mThreadManagerMode;
195  ThreadManager<TDatumsSP> mThreadManager;
196  bool mMultiThreadEnabled;
197  // Configuration
198  WrapperStructPose mWrapperStructPose;
199  WrapperStructFace mWrapperStructFace;
200  WrapperStructHand mWrapperStructHand;
201  WrapperStructExtra mWrapperStructExtra;
202  WrapperStructInput mWrapperStructInput;
203  WrapperStructOutput mWrapperStructOutput;
204  // User configurable workers
205  std::array<bool, int(WorkerType::Size)> mUserWsOnNewThread;
206  std::array<std::vector<TWorker>, int(WorkerType::Size)> mUserWs;
207 
208  DELETE_COPY(WrapperT);
209  };
210 
211  // Type
213 }
214 
215 
216 
217 
218 
219 // Implementation
221 namespace op
222 {
223  template<typename TDatums, typename TDatumsSP, typename TWorker>
225  mThreadManagerMode{threadManagerMode},
226  mThreadManager{threadManagerMode},
227  mMultiThreadEnabled{true}
228  {
229  }
230 
231  template<typename TDatums, typename TDatumsSP, typename TWorker>
233  {
234  try
235  {
236  stop();
237  // Reset mThreadManager
238  mThreadManager.reset();
239  // Reset user workers
240  for (auto& userW : mUserWs)
241  userW.clear();
242  }
243  catch (const std::exception& e)
244  {
245  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
246  }
247  }
248 
249  template<typename TDatums, typename TDatumsSP, typename TWorker>
251  {
252  try
253  {
254  mMultiThreadEnabled = false;
255  }
256  catch (const std::exception& e)
257  {
258  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
259  }
260  }
261 
262  template<typename TDatums, typename TDatumsSP, typename TWorker>
264  const WorkerType workerType, const TWorker& worker, const bool workerOnNewThread)
265  {
266  try
267  {
268  // Sanity check
269  if (worker == nullptr)
270  error("Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
271  // Add worker
272  mUserWs[int(workerType)].clear();
273  mUserWs[int(workerType)].emplace_back(worker);
274  mUserWsOnNewThread[int(workerType)] = workerOnNewThread;
275  }
276  catch (const std::exception& e)
277  {
278  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
279  }
280  }
281 
282  template<typename TDatums, typename TDatumsSP, typename TWorker>
284  {
285  try
286  {
287  mWrapperStructPose = wrapperStructPose;
288  }
289  catch (const std::exception& e)
290  {
291  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
292  }
293  }
294 
295  template<typename TDatums, typename TDatumsSP, typename TWorker>
297  {
298  try
299  {
300  mWrapperStructFace = wrapperStructFace;
301  }
302  catch (const std::exception& e)
303  {
304  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
305  }
306  }
307 
308  template<typename TDatums, typename TDatumsSP, typename TWorker>
310  {
311  try
312  {
313  mWrapperStructHand = wrapperStructHand;
314  }
315  catch (const std::exception& e)
316  {
317  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
318  }
319  }
320 
321  template<typename TDatums, typename TDatumsSP, typename TWorker>
323  {
324  try
325  {
326  mWrapperStructExtra = wrapperStructExtra;
327  }
328  catch (const std::exception& e)
329  {
330  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
331  }
332  }
333 
334  template<typename TDatums, typename TDatumsSP, typename TWorker>
336  {
337  try
338  {
339  mWrapperStructInput = wrapperStructInput;
340  }
341  catch (const std::exception& e)
342  {
343  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
344  }
345  }
346 
347  template<typename TDatums, typename TDatumsSP, typename TWorker>
349  {
350  try
351  {
352  mWrapperStructOutput = wrapperStructOutput;
353  }
354  catch (const std::exception& e)
355  {
356  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
357  }
358  }
359 
360  template<typename TDatums, typename TDatumsSP, typename TWorker>
362  {
363  try
364  {
365  configureThreadManager<TDatums, TDatumsSP, TWorker>(
366  mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
367  mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput,
368  mUserWs, mUserWsOnNewThread);
369  log("", Priority::Low, __LINE__, __FUNCTION__, __FILE__);
370  mThreadManager.exec();
371  }
372  catch (const std::exception& e)
373  {
374  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
375  }
376  }
377 
378  template<typename TDatums, typename TDatumsSP, typename TWorker>
380  {
381  try
382  {
383  configureThreadManager<TDatums, TDatumsSP, TWorker>(
384  mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
385  mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput,
386  mUserWs, mUserWsOnNewThread);
387  log("", Priority::Low, __LINE__, __FUNCTION__, __FILE__);
388  mThreadManager.start();
389  }
390  catch (const std::exception& e)
391  {
392  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
393  }
394  }
395 
396  template<typename TDatums, typename TDatumsSP, typename TWorker>
398  {
399  try
400  {
401  mThreadManager.stop();
402  }
403  catch (const std::exception& e)
404  {
405  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
406  }
407  }
408 
409  template<typename TDatums, typename TDatumsSP, typename TWorker>
411  {
412  try
413  {
414  return mThreadManager.isRunning();
415  }
416  catch (const std::exception& e)
417  {
418  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
419  return false;
420  }
421  }
422 
423  template<typename TDatums, typename TDatumsSP, typename TWorker>
425  {
426  try
427  {
428  if (!mUserWs[int(WorkerType::Input)].empty())
429  error("Emplace cannot be called if an input worker was already selected.",
430  __LINE__, __FUNCTION__, __FILE__);
431  return mThreadManager.tryEmplace(tDatums);
432  }
433  catch (const std::exception& e)
434  {
435  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
436  return false;
437  }
438  }
439 
440  template<typename TDatums, typename TDatumsSP, typename TWorker>
442  {
443  try
444  {
445  if (!mUserWs[int(WorkerType::Input)].empty())
446  error("Emplace cannot be called if an input worker was already selected.",
447  __LINE__, __FUNCTION__, __FILE__);
448  return mThreadManager.waitAndEmplace(tDatums);
449  }
450  catch (const std::exception& e)
451  {
452  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
453  return false;
454  }
455  }
456 
457  template<typename TDatums, typename TDatumsSP, typename TWorker>
458  bool WrapperT<TDatums, TDatumsSP, TWorker>::tryPush(const TDatumsSP& tDatums)
459  {
460  try
461  {
462  if (!mUserWs[int(WorkerType::Input)].empty())
463  error("Push cannot be called if an input worker was already selected.",
464  __LINE__, __FUNCTION__, __FILE__);
465  return mThreadManager.tryPush(tDatums);
466  }
467  catch (const std::exception& e)
468  {
469  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
470  return false;
471  }
472  }
473 
474  template<typename TDatums, typename TDatumsSP, typename TWorker>
476  {
477  try
478  {
479  if (!mUserWs[int(WorkerType::Input)].empty())
480  error("Push cannot be called if an input worker was already selected.",
481  __LINE__, __FUNCTION__, __FILE__);
482  return mThreadManager.waitAndPush(tDatums);
483  }
484  catch (const std::exception& e)
485  {
486  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
487  return false;
488  }
489  }
490 
491  template<typename TDatums, typename TDatumsSP, typename TWorker>
493  {
494  try
495  {
496  if (!mUserWs[int(WorkerType::Output)].empty())
497  error("Pop cannot be called if an output worker was already selected.",
498  __LINE__, __FUNCTION__, __FILE__);
499  return mThreadManager.tryPop(tDatums);
500  }
501  catch (const std::exception& e)
502  {
503  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
504  return false;
505  }
506  }
507 
508  template<typename TDatums, typename TDatumsSP, typename TWorker>
510  {
511  try
512  {
513  if (!mUserWs[int(WorkerType::Output)].empty())
514  error("Pop cannot be called if an output worker was already selected.",
515  __LINE__, __FUNCTION__, __FILE__);
516  return mThreadManager.waitAndPop(tDatums);
517  }
518  catch (const std::exception& e)
519  {
520  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
521  return false;
522  }
523  }
524 
525  template<typename TDatums, typename TDatumsSP, typename TWorker>
527  {
528  try
529  {
530  // Run waitAndEmplace + waitAndPop
531  if (waitAndEmplace(tDatums))
532  return waitAndPop(tDatums);
533  return false;
534  }
535  catch (const std::exception& e)
536  {
537  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
538  return false;
539  }
540  }
541 
542  template<typename TDatums, typename TDatumsSP, typename TWorker>
544  {
545  try
546  {
547  // Create new datum
548  auto datumsPtr = std::make_shared<TDatums>();
549  datumsPtr->emplace_back();
550  auto& datum = datumsPtr->at(0);
551  // Fill datum
552  datum.cvInputData = cvMat;
553  // Emplace and pop
554  emplaceAndPop(datumsPtr);
555  // Return result
556  return datumsPtr;
557  }
558  catch (const std::exception& e)
559  {
560  error(e.what(), __LINE__, __FUNCTION__, __FILE__);
561  return TDatumsSP{};
562  }
563  }
564 
565  extern template class WrapperT<DATUM_BASE_NO_PTR>;
566 }
567 
568 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
void setWorker(const WorkerType workerType, const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:263
WrapperT< DATUM_BASE_NO_PTR > Wrapper
Definition: wrapper.hpp:212
Definition: wrapperStructPose.hpp:17
bool tryPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:458
void start()
Definition: wrapper.hpp:379
bool waitAndEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:441
Definition: wrapperStructFace.hpp:15
void configure(const WrapperStructPose &wrapperStructPose)
Definition: wrapper.hpp:283
OP_API void error(const std::string &message, const int line=-1, const std::string &function="", const std::string &file="")
void stop()
Definition: wrapper.hpp:397
bool isRunning() const
Definition: wrapper.hpp:410
bool waitAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:509
WrapperT(const ThreadManagerMode threadManagerMode=ThreadManagerMode::Synchronous)
Definition: wrapper.hpp:224
Definition: wrapperStructInput.hpp:14
WorkerType
Definition: enumClasses.hpp:6
Definition: wrapper.hpp:34
OP_API void log(const std::string &message, const Priority priority=Priority::Max, const int line=-1, const std::string &function="", const std::string &file="")
void exec()
Definition: wrapper.hpp:361
Definition: wrapperStructExtra.hpp:13
Definition: wrapperStructHand.hpp:15
bool tryEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:424
bool tryPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:492
virtual ~WrapperT()
Definition: wrapper.hpp:232
ThreadManagerMode
Definition: enumClasses.hpp:9
bool emplaceAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:526
void disableMultiThreading()
Definition: wrapper.hpp:250
Definition: wrapperStructOutput.hpp:14
bool waitAndPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:475