diff --git a/doxygen.log b/doxygen.log
index 64f729a4..f2651e39 100644
--- a/doxygen.log
+++ b/doxygen.log
@@ -1130,5 +1130,5 @@ Generating file index...
Generating file member index...
Generating example index...
finalizing index lists...
-lookup cache used 4459/65536 hits=33864 misses=4763
+lookup cache used 4459/65536 hits=33870 misses=4763
finished...
diff --git a/html/wrapper_8hpp_source.html b/html/wrapper_8hpp_source.html
index c9fc8ac6..60b035ee 100644
--- a/html/wrapper_8hpp_source.html
+++ b/html/wrapper_8hpp_source.html
@@ -444,14 +444,14 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
-
- 473 if (numberThreads < 0)
-
-
-
+
+
+
+ 475 if (numberThreads < 0)
+
477 if (totalGpuNumber <= gpuNumberStart)
- 478 error(
"Number of initial GPUs (`--number_gpu_start`) must be lower than the total number of used"
- 479 " GPUs (`--number_gpu`)", __LINE__, __FUNCTION__, __FILE__);
+ 478 error(
"Number of initial GPU (`--number_gpu_start`) must be lower than the total number of"
+ 479 " used GPUs (`--number_gpu`)", __LINE__, __FUNCTION__, __FILE__);
480 numberThreads = totalGpuNumber - gpuNumberStart;
@@ -459,825 +459,833 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
484 +
" GPU(s), using " + std::to_string(numberThreads) +
" of them starting at GPU "
-
-
-
-
-
-
-
-
-
-
- 497 auto finalOutputSize = wrapperStructPose.
outputSize;
-
-
-
-
-
-
- 504 wrapperStructInput.
producerSharedPtr->setProducerFpsMode(displayProducerFpsMode);
-
-
-
-
-
-
-
-
- 513 if (finalOutputSize.x == -1 || finalOutputSize.y == -1)
- 514 finalOutputSize = producerSize;
-
-
-
-
-
- 520 const auto datumProducer = std::make_shared<DatumProducer<TDatums>>(
-
-
-
- 524 wDatumProducer = std::make_shared<WDatumProducer<TDatumsPtr, TDatums>>(datumProducer);
-
-
- 527 wDatumProducer =
nullptr;
-
- 529 std::vector<std::shared_ptr<PoseExtractor>> poseExtractors;
- 530 std::vector<std::shared_ptr<PoseGpuRenderer>> poseGpuRenderers;
- 531 std::shared_ptr<PoseCpuRenderer> poseCpuRenderer;
- 532 if (numberThreads > 0)
-
-
- 535 const auto scaleAndSizeExtractor = std::make_shared<ScaleAndSizeExtractor>(
-
-
-
- 539 spWScaleAndSizeExtractor = std::make_shared<WScaleAndSizeExtractor<TDatumsPtr>>(scaleAndSizeExtractor);
-
-
- 542 const auto cvMatToOpInput = std::make_shared<CvMatToOpInput>(wrapperStructPose.
poseModel);
- 543 spWCvMatToOpInput = std::make_shared<WCvMatToOpInput<TDatumsPtr>>(cvMatToOpInput);
-
-
- 546 const auto cvMatToOpOutput = std::make_shared<CvMatToOpOutput>();
- 547 spWCvMatToOpOutput = std::make_shared<WCvMatToOpOutput<TDatumsPtr>>(cvMatToOpOutput);
-
-
-
- 551 std::vector<TWorker> cpuRenderers;
-
- 553 spWPoses.resize(numberThreads);
- 554 if (wrapperStructPose.
enable)
-
-
- 557 for (
auto gpuId = 0; gpuId < numberThreads; gpuId++)
- 558 poseExtractors.emplace_back(std::make_shared<PoseExtractorCaffe>(
- 559 wrapperStructPose.
poseModel, modelFolder, gpuId + gpuNumberStart,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 576 for (
const auto& poseExtractor : poseExtractors)
-
- 578 poseGpuRenderers.emplace_back(std::make_shared<PoseGpuRenderer>(
-
-
-
-
-
-
-
-
-
- 588 poseCpuRenderer = std::make_shared<PoseCpuRenderer>(
-
-
-
-
-
-
-
-
-
- 598 spWPoses.resize(poseExtractors.size());
- 599 for (
auto i = 0u; i < spWPoses.size(); i++)
- 600 spWPoses.at(i) = {std::make_shared<WPoseExtractor<TDatumsPtr>>(poseExtractors.at(i))};
-
-
-
-
-
-
-
- 608 const auto keepTopNPeople = std::make_shared<KeepTopNPeople>(wrapperStructPose.
numberPeopleMax);
- 609 for (
auto& wPose : spWPoses)
-
-
-
-
-
-
- 616 if (wrapperStructFace.
enable)
-
-
-
- 620 if (wrapperStructPose.
enable)
-
- 622 const auto faceDetector = std::make_shared<FaceDetector>(wrapperStructPose.
poseModel);
- 623 for (
auto& wPose : spWPoses)
-
-
-
-
-
- 629 log(
"Body keypoint detection is disabled. Hence, using OpenCV face detector (much less"
-
+
+ 488 if (gpuNumberStart + numberThreads > totalGpuNumber)
+ 489 error(
"Initial GPU selected (`--number_gpu_start`) + number GPUs to use (`--number_gpu`) must"
+ 490 " be lower or equal than the total number of GPUs in your machine ("
+ 491 + std::to_string(gpuNumberStart) +
" + "
+ 492 + std::to_string(numberThreads) +
" vs. "
+ 493 + std::to_string(totalGpuNumber) +
").",
+ 494 __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+
+
+
+
+
+
+ 505 auto finalOutputSize = wrapperStructPose.
outputSize;
+
+
+
+
+
+
+ 512 wrapperStructInput.
producerSharedPtr->setProducerFpsMode(displayProducerFpsMode);
+
+
+
+
+
+
+
+
+ 521 if (finalOutputSize.x == -1 || finalOutputSize.y == -1)
+ 522 finalOutputSize = producerSize;
+
+
+
+
+
+ 528 const auto datumProducer = std::make_shared<DatumProducer<TDatums>>(
+
+
+
+ 532 wDatumProducer = std::make_shared<WDatumProducer<TDatumsPtr, TDatums>>(datumProducer);
+
+
+ 535 wDatumProducer =
nullptr;
+
+ 537 std::vector<std::shared_ptr<PoseExtractor>> poseExtractors;
+ 538 std::vector<std::shared_ptr<PoseGpuRenderer>> poseGpuRenderers;
+ 539 std::shared_ptr<PoseCpuRenderer> poseCpuRenderer;
+ 540 if (numberThreads > 0)
+
+
+ 543 const auto scaleAndSizeExtractor = std::make_shared<ScaleAndSizeExtractor>(
+
+
+
+ 547 spWScaleAndSizeExtractor = std::make_shared<WScaleAndSizeExtractor<TDatumsPtr>>(scaleAndSizeExtractor);
+
+
+ 550 const auto cvMatToOpInput = std::make_shared<CvMatToOpInput>(wrapperStructPose.
poseModel);
+ 551 spWCvMatToOpInput = std::make_shared<WCvMatToOpInput<TDatumsPtr>>(cvMatToOpInput);
+
+
+ 554 const auto cvMatToOpOutput = std::make_shared<CvMatToOpOutput>();
+ 555 spWCvMatToOpOutput = std::make_shared<WCvMatToOpOutput<TDatumsPtr>>(cvMatToOpOutput);
+
+
+
+ 559 std::vector<TWorker> cpuRenderers;
+
+ 561 spWPoses.resize(numberThreads);
+ 562 if (wrapperStructPose.
enable)
+
+
+ 565 for (
auto gpuId = 0; gpuId < numberThreads; gpuId++)
+ 566 poseExtractors.emplace_back(std::make_shared<PoseExtractorCaffe>(
+ 567 wrapperStructPose.
poseModel, modelFolder, gpuId + gpuNumberStart,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 584 for (
const auto& poseExtractor : poseExtractors)
+
+ 586 poseGpuRenderers.emplace_back(std::make_shared<PoseGpuRenderer>(
+
+
+
+
+
+
+
+
+
+ 596 poseCpuRenderer = std::make_shared<PoseCpuRenderer>(
+
+
+
+
+
+
+
+
+
+ 606 spWPoses.resize(poseExtractors.size());
+ 607 for (
auto i = 0u; i < spWPoses.size(); i++)
+ 608 spWPoses.at(i) = {std::make_shared<WPoseExtractor<TDatumsPtr>>(poseExtractors.at(i))};
+
+
+
+
+
+
+
+ 616 const auto keepTopNPeople = std::make_shared<KeepTopNPeople>(wrapperStructPose.
numberPeopleMax);
+ 617 for (
auto& wPose : spWPoses)
+
+
+
+
+
+
+ 624 if (wrapperStructFace.
enable)
+
+
+
+ 628 if (wrapperStructPose.
enable)
+
+ 630 const auto faceDetector = std::make_shared<FaceDetector>(wrapperStructPose.
poseModel);
631 for (
auto& wPose : spWPoses)
-
-
- 634 const auto faceDetectorOpenCV = std::make_shared<FaceDetectorOpenCV>(modelFolder);
-
-
-
-
-
-
- 641 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
- 644 const auto netOutputSize = wrapperStructFace.
netInputSize;
- 645 const auto faceExtractor = std::make_shared<FaceExtractorCaffe>(
- 646 wrapperStructFace.
netInputSize, netOutputSize, modelFolder,
-
-
-
-
-
-
-
-
- 655 if (wrapperStructHand.
enable)
-
- 657 const auto handDetector = std::make_shared<HandDetector>(wrapperStructPose.
poseModel);
- 658 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
-
-
- 663 spWPoses.at(gpu).emplace_back(
-
-
-
-
-
-
- 670 const auto netOutputSize = wrapperStructHand.
netInputSize;
- 671 const auto handExtractor = std::make_shared<HandExtractorCaffe>(
- 672 wrapperStructHand.
netInputSize, netOutputSize, modelFolder,
-
-
-
-
- 677 spWPoses.at(gpu).emplace_back(
-
-
-
-
- 682 spWPoses.at(gpu).emplace_back(
-
-
-
-
-
-
- 689 if (!poseGpuRenderers.empty())
- 690 for (
auto i = 0u; i < spWPoses.size(); i++)
-
- 692 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 702 const auto faceRenderer = std::make_shared<FaceCpuRenderer>(wrapperStructFace.
renderThreshold,
-
-
-
-
-
-
-
-
- 711 for (
auto i = 0u; i < spWPoses.size(); i++)
-
-
- 714 const auto faceRenderer = std::make_shared<FaceGpuRenderer>(
-
-
-
-
- 719 if (!poseGpuRenderers.empty())
-
- 721 const bool isLastRenderer = !renderHandGpu;
-
- 723 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 733 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
-
-
-
-
-
- 743 const auto handRenderer = std::make_shared<HandCpuRenderer>(wrapperStructHand.
renderThreshold,
-
-
-
-
-
-
-
-
- 752 for (
auto i = 0u; i < spWPoses.size(); i++)
-
-
- 755 const auto handRenderer = std::make_shared<HandGpuRenderer>(
-
-
-
-
- 760 if (!poseGpuRenderers.empty())
-
- 762 const bool isLastRenderer =
true;
-
- 764 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 774 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 778 mPostProcessingWs.clear();
-
- 780 if (spWPoses.size() > 1u)
-
-
-
-
- 785 const auto personIdExtractor = std::make_shared<PersonIdExtractor>();
- 786 mPostProcessingWs.emplace_back(
-
-
-
-
-
+
+
+
+
+
+ 637 log(
"Body keypoint detection is disabled. Hence, using OpenCV face detector (much less"
+
+ 639 for (
auto& wPose : spWPoses)
+
+
+ 642 const auto faceDetectorOpenCV = std::make_shared<FaceDetectorOpenCV>(modelFolder);
+
+
+
+
+
+
+ 649 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+ 652 const auto netOutputSize = wrapperStructFace.
netInputSize;
+ 653 const auto faceExtractor = std::make_shared<FaceExtractorCaffe>(
+ 654 wrapperStructFace.
netInputSize, netOutputSize, modelFolder,
+
+
+
+
+
+
+
+
+ 663 if (wrapperStructHand.
enable)
+
+ 665 const auto handDetector = std::make_shared<HandDetector>(wrapperStructPose.
poseModel);
+ 666 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+
+
+ 671 spWPoses.at(gpu).emplace_back(
+
+
+
+
+
+
+ 678 const auto netOutputSize = wrapperStructHand.
netInputSize;
+ 679 const auto handExtractor = std::make_shared<HandExtractorCaffe>(
+ 680 wrapperStructHand.
netInputSize, netOutputSize, modelFolder,
+
+
+
+
+ 685 spWPoses.at(gpu).emplace_back(
+
+
+
+
+ 690 spWPoses.at(gpu).emplace_back(
+
+
+
+
+
+
+ 697 if (!poseGpuRenderers.empty())
+ 698 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+ 700 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 710 const auto faceRenderer = std::make_shared<FaceCpuRenderer>(wrapperStructFace.
renderThreshold,
+
+
+
+
+
+
+
+
+ 719 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+
+ 722 const auto faceRenderer = std::make_shared<FaceGpuRenderer>(
+
+
+
+
+ 727 if (!poseGpuRenderers.empty())
+
+ 729 const bool isLastRenderer = !renderHandGpu;
+
+ 731 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 741 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+
+
+
+
+
+ 751 const auto handRenderer = std::make_shared<HandCpuRenderer>(wrapperStructHand.
renderThreshold,
+
+
+
+
+
+
+
+
+ 760 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+
+ 763 const auto handRenderer = std::make_shared<HandGpuRenderer>(
+
+
+
+
+ 768 if (!poseGpuRenderers.empty())
+
+ 770 const bool isLastRenderer =
true;
+
+ 772 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 782 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 786 mPostProcessingWs.clear();
+
+ 788 if (spWPoses.size() > 1u)
+
+
+
- 793 mPostProcessingWs.emplace_back(
-
-
-
-
-
-
- 800 mPostProcessingWs =
mergeVectors(mPostProcessingWs, cpuRenderers);
- 801 const auto opOutputToCvMat = std::make_shared<OpOutputToCvMat>();
-
-
-
-
-
-
-
- 809 (finalOutputSize == producerSize || finalOutputSize.x <= 0 || finalOutputSize.y <= 0))
-
-
-
-
-
- 815 auto keypointScaler = std::make_shared<KeypointScaler>(wrapperStructPose.
keypointScale);
-
-
-
-
-
-
- 822 if (!writeKeypointCleaned.empty())
-
- 824 const auto keypointSaver = std::make_shared<KeypointSaver>(writeKeypointCleaned,
-
-
- 827 if (wrapperStructFace.
enable)
-
- 829 if (wrapperStructHand.
enable)
-
-
-
-
- 834 if (!writeJsonCleaned.empty())
-
- 836 const auto peopleJsonSaver = std::make_shared<PeopleJsonSaver>(writeJsonCleaned);
-
-
-
-
-
-
- 843 const auto humanFormat =
true;
- 844 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoJson,
-
-
-
-
- 849 if (!writeImagesCleaned.empty())
-
- 851 const auto imageSaver = std::make_shared<ImageSaver>(writeImagesCleaned,
-
-
-
-
-
-
- 858 if (finalOutputSize.x <= 0 || finalOutputSize.y <= 0)
- 859 error(
"Video can only be recorded if outputSize is fixed (e.g. video, webcam, IP camera),"
- 860 "but not for a image directory.", __LINE__, __FUNCTION__, __FILE__);
- 861 const auto originalVideoFps = (wrapperStructInput.
producerSharedPtr->get(CV_CAP_PROP_FPS) > 0.
-
- 863 const auto videoSaver = std::make_shared<VideoSaver>(
- 864 wrapperStructOutput.
writeVideo, CV_FOURCC(
'M',
'J',
'P',
'G'), originalVideoFps, finalOutputSize
-
-
-
-
- 869 if (!writeHeatMapsCleaned.empty())
-
- 871 const auto heatMapSaver = std::make_shared<HeatMapSaver>(writeHeatMapsCleaned,
-
-
-
-
-
-
-
- 879 if (wrapperStructOutput.
guiVerbose && (guiEnabled || !mUserOutputWs.empty()
-
-
-
- 883 const auto guiInfoAdder = std::make_shared<GuiInfoAdder>(numberThreads, guiEnabled);
-
-
-
-
-
-
-
- 891 std::vector<std::shared_ptr<Renderer>> renderers;
-
- 893 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseCpuRenderer));
-
- 895 for (
const auto& poseGpuRenderer : poseGpuRenderers)
- 896 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseGpuRenderer));
-
-
-
-
-
-
- 903 auto gui = std::make_shared<Gui3D>(
- 904 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
- 905 spVideoSeek, poseExtractors, renderers, wrapperStructPose.
poseModel,
-
-
-
- 909 spWGui = {std::make_shared<WGui3D<TDatumsPtr>>(gui)};
-
-
-
-
-
- 915 auto gui = std::make_shared<Gui>(
- 916 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
- 917 spVideoSeek, poseExtractors, renderers
-
-
- 920 spWGui = {std::make_shared<WGui<TDatumsPtr>>(gui)};
-
-
- 923 error(
"Unknown DisplayMode.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
-
- 929 catch (
const std::exception& e)
-
- 931 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 935 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 940 configureThreadManager();
-
- 942 mThreadManager.exec();
-
- 944 catch (
const std::exception& e)
-
- 946 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 950 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 955 configureThreadManager();
-
- 957 mThreadManager.start();
-
- 959 catch (
const std::exception& e)
-
- 961 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 965 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 970 mThreadManager.stop();
-
- 972 catch (
const std::exception& e)
-
- 974 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 978 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 983 return mThreadManager.isRunning();
-
- 985 catch (
const std::exception& e)
-
- 987 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 992 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 997 if (!mUserInputWs.empty())
- 998 error(
"Emplace cannot be called if an input worker was already selected.",
- 999 __LINE__, __FUNCTION__, __FILE__);
- 1000 return mThreadManager.tryEmplace(tDatums);
-
- 1002 catch (
const std::exception& e)
-
- 1004 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1009 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1014 if (!mUserInputWs.empty())
- 1015 error(
"Emplace cannot be called if an input worker was already selected.",
- 1016 __LINE__, __FUNCTION__, __FILE__);
- 1017 return mThreadManager.waitAndEmplace(tDatums);
-
- 1019 catch (
const std::exception& e)
-
- 1021 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1026 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1031 if (!mUserInputWs.empty())
- 1032 error(
"Push cannot be called if an input worker was already selected.",
- 1033 __LINE__, __FUNCTION__, __FILE__);
- 1034 return mThreadManager.tryPush(tDatums);
-
- 1036 catch (
const std::exception& e)
-
- 1038 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1043 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1048 if (!mUserInputWs.empty())
- 1049 error(
"Push cannot be called if an input worker was already selected.",
- 1050 __LINE__, __FUNCTION__, __FILE__);
- 1051 return mThreadManager.waitAndPush(tDatums);
-
- 1053 catch (
const std::exception& e)
-
- 1055 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1060 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1065 if (!mUserOutputWs.empty())
- 1066 error(
"Pop cannot be called if an output worker was already selected.",
- 1067 __LINE__, __FUNCTION__, __FILE__);
- 1068 return mThreadManager.tryPop(tDatums);
-
- 1070 catch (
const std::exception& e)
-
- 1072 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1077 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1082 if (!mUserOutputWs.empty())
- 1083 error(
"Pop cannot be called if an output worker was already selected.",
- 1084 __LINE__, __FUNCTION__, __FILE__);
- 1085 return mThreadManager.waitAndPop(tDatums);
-
- 1087 catch (
const std::exception& e)
-
- 1089 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1094 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1099 mConfigured =
false;
- 1100 mThreadManager.reset();
-
-
- 1103 mUserInputWs.clear();
- 1104 wDatumProducer =
nullptr;
- 1105 spWScaleAndSizeExtractor =
nullptr;
- 1106 spWCvMatToOpInput =
nullptr;
- 1107 spWCvMatToOpOutput =
nullptr;
-
- 1109 mPostProcessingWs.clear();
- 1110 mUserPostProcessingWs.clear();
-
-
- 1113 mUserOutputWs.clear();
-
- 1115 catch (
const std::exception& e)
-
- 1117 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 1121 template<
typename TDatums,
typename TWorker,
typename TQueue>
- 1122 void Wrapper<TDatums, TWorker, TQueue>::configureThreadManager()
-
-
-
-
-
-
-
- 1130 error(
"Configure the Wrapper class before calling `start()`.", __LINE__, __FUNCTION__, __FILE__);
- 1131 if ((wDatumProducer ==
nullptr) == (mUserInputWs.empty())
-
-
-
- 1135 const auto message =
"You need to have 1 and only 1 producer selected. You can introduce your own"
- 1136 " producer by using setWorkerInput() or use the OpenPose default producer by"
- 1137 " configuring it in the configure function) or use the"
- 1138 " ThreadManagerMode::Asynchronous(In) mode.";
- 1139 error(message, __LINE__, __FUNCTION__, __FILE__);
-
- 1141 if (mOutputWs.empty() && mUserOutputWs.empty() && spWGui ==
nullptr
-
-
-
- 1145 error(
"No output selected.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1150 mThreadManager.reset();
-
- 1152 auto queueIn = 0ull;
- 1153 auto queueOut = 1ull;
-
- 1155 spWIdGenerator = std::make_shared<WIdGenerator<std::shared_ptr<TDatums>>>();
- 1156 if (!mUserInputWs.empty() && mUserInputWsOnNewThread)
-
-
- 1159 mThreadManager.add(mThreadId, mUserInputWs, queueIn++, queueOut++);
- 1160 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
-
-
-
- 1164 if (spWCvMatToOpOutput ==
nullptr)
- 1165 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput},
- 1166 queueIn++, queueOut++);
-
- 1168 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput,
- 1169 spWCvMatToOpOutput}, queueIn++, queueOut++);
-
-
- 1172 mThreadManager.add(mThreadId, spWIdGenerator, queueIn++, queueOut++);
-
-
-
-
- 1177 std::vector<TWorker> workersAux;
-
- 1179 if (!mUserInputWs.empty())
-
-
- 1182 else if (wDatumProducer !=
nullptr)
- 1183 workersAux =
mergeVectors(workersAux, {wDatumProducer});
-
-
-
- 1187 error(
"No input selected.", __LINE__, __FUNCTION__, __FILE__);
-
- 1189 workersAux =
mergeVectors(workersAux, {spWIdGenerator});
-
- 1191 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
- 1192 workersAux =
mergeVectors(workersAux, {spWScaleAndSizeExtractor,
- 1193 spWCvMatToOpInput});
-
- 1195 if (spWCvMatToOpOutput !=
nullptr)
- 1196 workersAux =
mergeVectors(workersAux, {spWCvMatToOpOutput});
-
- 1198 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
-
-
-
-
- 1203 if (!spWPoses.empty())
-
- 1205 if (mMultiThreadEnabled)
-
- 1207 for (
auto& wPose : spWPoses)
-
- 1209 mThreadManager.add(mThreadId, wPose, queueIn, queueOut);
-
-
-
-
+ 793 const auto personIdExtractor = std::make_shared<PersonIdExtractor>();
+ 794 mPostProcessingWs.emplace_back(
+
+
+
+
+
+
+ 801 mPostProcessingWs.emplace_back(
+
+
+
+
+
+
+ 808 mPostProcessingWs =
mergeVectors(mPostProcessingWs, cpuRenderers);
+ 809 const auto opOutputToCvMat = std::make_shared<OpOutputToCvMat>();
+
+
+
+
+
+
+
+ 817 (finalOutputSize == producerSize || finalOutputSize.x <= 0 || finalOutputSize.y <= 0))
+
+
+
+
+
+ 823 auto keypointScaler = std::make_shared<KeypointScaler>(wrapperStructPose.
keypointScale);
+
+
+
+
+
+
+ 830 if (!writeKeypointCleaned.empty())
+
+ 832 const auto keypointSaver = std::make_shared<KeypointSaver>(writeKeypointCleaned,
+
+
+ 835 if (wrapperStructFace.
enable)
+
+ 837 if (wrapperStructHand.
enable)
+
+
+
+
+ 842 if (!writeJsonCleaned.empty())
+
+ 844 const auto peopleJsonSaver = std::make_shared<PeopleJsonSaver>(writeJsonCleaned);
+
+
+
+
+
+
+ 851 const auto humanFormat =
true;
+ 852 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoJson,
+
+
+
+
+ 857 if (!writeImagesCleaned.empty())
+
+ 859 const auto imageSaver = std::make_shared<ImageSaver>(writeImagesCleaned,
+
+
+
+
+
+
+ 866 if (finalOutputSize.x <= 0 || finalOutputSize.y <= 0)
+ 867 error(
"Video can only be recorded if outputSize is fixed (e.g. video, webcam, IP camera),"
+ 868 "but not for a image directory.", __LINE__, __FUNCTION__, __FILE__);
+ 869 const auto originalVideoFps = (wrapperStructInput.
producerSharedPtr->get(CV_CAP_PROP_FPS) > 0.
+
+ 871 const auto videoSaver = std::make_shared<VideoSaver>(
+ 872 wrapperStructOutput.
writeVideo, CV_FOURCC(
'M',
'J',
'P',
'G'), originalVideoFps, finalOutputSize
+
+
+
+
+ 877 if (!writeHeatMapsCleaned.empty())
+
+ 879 const auto heatMapSaver = std::make_shared<HeatMapSaver>(writeHeatMapsCleaned,
+
+
+
+
+
+
+
+ 887 if (wrapperStructOutput.
guiVerbose && (guiEnabled || !mUserOutputWs.empty()
+
+
+
+ 891 const auto guiInfoAdder = std::make_shared<GuiInfoAdder>(numberThreads, guiEnabled);
+
+
+
+
+
+
+
+ 899 std::vector<std::shared_ptr<Renderer>> renderers;
+
+ 901 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseCpuRenderer));
+
+ 903 for (
const auto& poseGpuRenderer : poseGpuRenderers)
+ 904 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseGpuRenderer));
+
+
+
+
+
+
+ 911 auto gui = std::make_shared<Gui3D>(
+ 912 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
+ 913 spVideoSeek, poseExtractors, renderers, wrapperStructPose.
poseModel,
+
+
+
+ 917 spWGui = {std::make_shared<WGui3D<TDatumsPtr>>(gui)};
+
+
+
+
+
+ 923 auto gui = std::make_shared<Gui>(
+ 924 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
+ 925 spVideoSeek, poseExtractors, renderers
+
+
+ 928 spWGui = {std::make_shared<WGui<TDatumsPtr>>(gui)};
+
+
+ 931 error(
"Unknown DisplayMode.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+
+ 937 catch (
const std::exception& e)
+
+ 939 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 943 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 948 configureThreadManager();
+
+ 950 mThreadManager.exec();
+
+ 952 catch (
const std::exception& e)
+
+ 954 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 958 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 963 configureThreadManager();
+
+ 965 mThreadManager.start();
+
+ 967 catch (
const std::exception& e)
+
+ 969 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 973 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 978 mThreadManager.stop();
+
+ 980 catch (
const std::exception& e)
+
+ 982 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 986 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 991 return mThreadManager.isRunning();
+
+ 993 catch (
const std::exception& e)
+
+ 995 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1000 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1005 if (!mUserInputWs.empty())
+ 1006 error(
"Emplace cannot be called if an input worker was already selected.",
+ 1007 __LINE__, __FUNCTION__, __FILE__);
+ 1008 return mThreadManager.tryEmplace(tDatums);
+
+ 1010 catch (
const std::exception& e)
+
+ 1012 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1017 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1022 if (!mUserInputWs.empty())
+ 1023 error(
"Emplace cannot be called if an input worker was already selected.",
+ 1024 __LINE__, __FUNCTION__, __FILE__);
+ 1025 return mThreadManager.waitAndEmplace(tDatums);
+
+ 1027 catch (
const std::exception& e)
+
+ 1029 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1034 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1039 if (!mUserInputWs.empty())
+ 1040 error(
"Push cannot be called if an input worker was already selected.",
+ 1041 __LINE__, __FUNCTION__, __FILE__);
+ 1042 return mThreadManager.tryPush(tDatums);
+
+ 1044 catch (
const std::exception& e)
+
+ 1046 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1051 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1056 if (!mUserInputWs.empty())
+ 1057 error(
"Push cannot be called if an input worker was already selected.",
+ 1058 __LINE__, __FUNCTION__, __FILE__);
+ 1059 return mThreadManager.waitAndPush(tDatums);
+
+ 1061 catch (
const std::exception& e)
+
+ 1063 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1068 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1073 if (!mUserOutputWs.empty())
+ 1074 error(
"Pop cannot be called if an output worker was already selected.",
+ 1075 __LINE__, __FUNCTION__, __FILE__);
+ 1076 return mThreadManager.tryPop(tDatums);
+
+ 1078 catch (
const std::exception& e)
+
+ 1080 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1085 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1090 if (!mUserOutputWs.empty())
+ 1091 error(
"Pop cannot be called if an output worker was already selected.",
+ 1092 __LINE__, __FUNCTION__, __FILE__);
+ 1093 return mThreadManager.waitAndPop(tDatums);
+
+ 1095 catch (
const std::exception& e)
+
+ 1097 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1102 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1107 mConfigured =
false;
+ 1108 mThreadManager.reset();
+
+
+ 1111 mUserInputWs.clear();
+ 1112 wDatumProducer =
nullptr;
+ 1113 spWScaleAndSizeExtractor =
nullptr;
+ 1114 spWCvMatToOpInput =
nullptr;
+ 1115 spWCvMatToOpOutput =
nullptr;
+
+ 1117 mPostProcessingWs.clear();
+ 1118 mUserPostProcessingWs.clear();
+
+
+ 1121 mUserOutputWs.clear();
+
+ 1123 catch (
const std::exception& e)
+
+ 1125 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 1129 template<
typename TDatums,
typename TWorker,
typename TQueue>
+ 1130 void Wrapper<TDatums, TWorker, TQueue>::configureThreadManager()
+
+
+
+
+
+
+
+ 1138 error(
"Configure the Wrapper class before calling `start()`.", __LINE__, __FUNCTION__, __FILE__);
+ 1139 if ((wDatumProducer ==
nullptr) == (mUserInputWs.empty())
+
+
+
+ 1143 const auto message =
"You need to have 1 and only 1 producer selected. You can introduce your own"
+ 1144 " producer by using setWorkerInput() or use the OpenPose default producer by"
+ 1145 " configuring it in the configure function) or use the"
+ 1146 " ThreadManagerMode::Asynchronous(In) mode.";
+ 1147 error(message, __LINE__, __FUNCTION__, __FILE__);
+
+ 1149 if (mOutputWs.empty() && mUserOutputWs.empty() && spWGui ==
nullptr
+
+
+
+ 1153 error(
"No output selected.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1158 mThreadManager.reset();
+
+ 1160 auto queueIn = 0ull;
+ 1161 auto queueOut = 1ull;
+
+ 1163 spWIdGenerator = std::make_shared<WIdGenerator<std::shared_ptr<TDatums>>>();
+ 1164 if (!mUserInputWs.empty() && mUserInputWsOnNewThread)
+
+
+ 1167 mThreadManager.add(mThreadId, mUserInputWs, queueIn++, queueOut++);
+ 1168 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
+
+
+
+ 1172 if (spWCvMatToOpOutput ==
nullptr)
+ 1173 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput},
+ 1174 queueIn++, queueOut++);
+
+ 1176 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput,
+ 1177 spWCvMatToOpOutput}, queueIn++, queueOut++);
+
+
+ 1180 mThreadManager.add(mThreadId, spWIdGenerator, queueIn++, queueOut++);
+
+
+
+
+ 1185 std::vector<TWorker> workersAux;
+
+ 1187 if (!mUserInputWs.empty())
+
+
+ 1190 else if (wDatumProducer !=
nullptr)
+ 1191 workersAux =
mergeVectors(workersAux, {wDatumProducer});
+
+
+
+ 1195 error(
"No input selected.", __LINE__, __FUNCTION__, __FILE__);
+
+ 1197 workersAux =
mergeVectors(workersAux, {spWIdGenerator});
+
+ 1199 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
+ 1200 workersAux =
mergeVectors(workersAux, {spWScaleAndSizeExtractor,
+ 1201 spWCvMatToOpInput});
+
+ 1203 if (spWCvMatToOpOutput !=
nullptr)
+ 1204 workersAux =
mergeVectors(workersAux, {spWCvMatToOpOutput});
+
+ 1206 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
+
+
+
+
+ 1211 if (!spWPoses.empty())
+
+ 1213 if (mMultiThreadEnabled)
- 1215 if (spWPoses.size() > 1)
- 1216 log(
"Multi-threading disabled, only 1 thread running. All GPUs have been disabled but the"
- 1217 " first one, which is defined by gpuNumberStart (e.g. in the OpenPose demo, it is set"
-
- 1219 mThreadManager.add(mThreadId, spWPoses.at(0), queueIn, queueOut);
+ 1215 for (
auto& wPose : spWPoses)
+
+ 1217 mThreadManager.add(mThreadId, wPose, queueIn, queueOut);
+
+
-
-
-
-
- 1225 if (!mUserPostProcessingWs.empty() && mUserPostProcessingWsOnNewThread)
-
-
- 1228 if (!mPostProcessingWs.empty())
-
-
- 1231 mThreadManager.add(mThreadId, mPostProcessingWs, queueIn++, queueOut++);
-
-
-
-
- 1236 mThreadManager.add(mThreadId, mUserPostProcessingWs, queueIn++, queueOut++);
-
-
- 1239 if (!mOutputWs.empty())
-
-
- 1242 mThreadManager.add(mThreadId, mOutputWs, queueIn++, queueOut++);
-
-
-
-
-
-
-
- 1250 auto workersAux =
mergeVectors(mPostProcessingWs, mUserPostProcessingWs);
-
- 1252 if (!workersAux.empty())
-
-
- 1255 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
-
-
-
-
-
- 1261 if (!mUserOutputWs.empty())
-
- 1263 if (mUserOutputWsOnNewThread)
-
- 1265 mThreadManager.add(mThreadId, mUserOutputWs, queueIn++, queueOut++);
-
-
-
- 1269 mThreadManager.add(mThreadId-1, mUserOutputWs, queueIn++, queueOut++);
-
-
- 1272 if (spWGui !=
nullptr)
-
-
- 1275 mThreadManager.add(mThreadId, spWGui, queueIn++, queueOut++);
-
-
-
-
- 1280 catch (
const std::exception& e)
-
- 1282 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 1286 template<
typename TDatums,
typename TWorker,
typename TQueue>
- 1287 unsigned long long Wrapper<TDatums, TWorker, TQueue>::threadIdPP()
-
-
-
- 1291 if (mMultiThreadEnabled)
-
-
-
- 1295 catch (
const std::exception& e)
-
- 1297 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1302 extern template class Wrapper<DATUM_BASE_NO_PTR>;
-
-
- 1305 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
+
+
+ 1223 if (spWPoses.size() > 1)
+ 1224 log(
"Multi-threading disabled, only 1 thread running. All GPUs have been disabled but the"
+ 1225 " first one, which is defined by gpuNumberStart (e.g. in the OpenPose demo, it is set"
+
+ 1227 mThreadManager.add(mThreadId, spWPoses.at(0), queueIn, queueOut);
+
+
+
+
+
+ 1233 if (!mUserPostProcessingWs.empty() && mUserPostProcessingWsOnNewThread)
+
+
+ 1236 if (!mPostProcessingWs.empty())
+
+
+ 1239 mThreadManager.add(mThreadId, mPostProcessingWs, queueIn++, queueOut++);
+
+
+
+
+ 1244 mThreadManager.add(mThreadId, mUserPostProcessingWs, queueIn++, queueOut++);
+
+
+ 1247 if (!mOutputWs.empty())
+
+
+ 1250 mThreadManager.add(mThreadId, mOutputWs, queueIn++, queueOut++);
+
+
+
+
+
+
+
+ 1258 auto workersAux =
mergeVectors(mPostProcessingWs, mUserPostProcessingWs);
+
+ 1260 if (!workersAux.empty())
+
+
+ 1263 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
+
+
+
+
+
+ 1269 if (!mUserOutputWs.empty())
+
+ 1271 if (mUserOutputWsOnNewThread)
+
+ 1273 mThreadManager.add(mThreadId, mUserOutputWs, queueIn++, queueOut++);
+
+
+
+ 1277 mThreadManager.add(mThreadId-1, mUserOutputWs, queueIn++, queueOut++);
+
+
+ 1280 if (spWGui !=
nullptr)
+
+
+ 1283 mThreadManager.add(mThreadId, spWGui, queueIn++, queueOut++);
+
+
+
+
+ 1288 catch (
const std::exception& e)
+
+ 1290 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 1294 template<
typename TDatums,
typename TWorker,
typename TQueue>
+ 1295 unsigned long long Wrapper<TDatums, TWorker, TQueue>::threadIdPP()
+
+
+
+ 1299 if (mMultiThreadEnabled)
+
+
+
+ 1303 catch (
const std::exception& e)
+
+ 1305 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1310 extern template class Wrapper<DATUM_BASE_NO_PTR>;
+
+
+ 1313 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
PoseModel poseModel
Definition: wrapperStructPose.hpp:88
@@ -1300,17 +1308,17 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
Definition: wPoseSaver.hpp:12
bool identification
Definition: wrapperStructPose.hpp:181
-bool tryPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1027
+bool tryPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1035
Definition: wrapperStructPose.hpp:17
std::string writeKeypoint
Definition: wrapperStructOutput.hpp:44
float alphaKeypoint
Definition: wrapperStructFace.hpp:39
Definition: wFaceSaver.hpp:12
-void stop()
Definition: wrapper.hpp:966
+void stop()
Definition: wrapper.hpp:974
float alphaKeypoint
Definition: wrapperStructHand.hpp:59
-bool tryPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1061
-void exec()
Definition: wrapper.hpp:936
+bool tryPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1069
+void exec()
Definition: wrapper.hpp:944
@@ -1349,9 +1357,9 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
float scaleGap
Definition: wrapperStructPose.hpp:75
RenderMode renderMode
Definition: wrapperStructPose.hpp:81
-bool waitAndEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1010
+bool waitAndEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1018
Definition: wrapper.hpp:32
-bool tryEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:993
+bool tryEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1001
float scaleRange
Definition: wrapperStructHand.hpp:40
OP_API GpuMode getGpuMode()
int gpuNumberStart
Definition: wrapperStructPose.hpp:60
@@ -1363,8 +1371,8 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
Definition: wVideoSaver.hpp:11
Definition: wOpOutputToCvMat.hpp:11
-bool waitAndPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1044
-void start()
Definition: wrapper.hpp:951
+bool waitAndPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1052
+void start()
Definition: wrapper.hpp:959
OP_API std::string formatAsDirectory(const std::string &directoryPathString)
@@ -1380,7 +1388,7 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
Definition: wFaceRenderer.hpp:11
-bool waitAndPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1078
+bool waitAndPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1086
Definition: threadManager.hpp:16
Definition: wPoseRenderer.hpp:11
@@ -1419,7 +1427,7 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
ScaleMode keypointScale
Definition: wrapperStructPose.hpp:47
ThreadManagerMode
Definition: enumClasses.hpp:9
int gpuNumber
Definition: wrapperStructPose.hpp:54
-bool isRunning() const
Definition: wrapper.hpp:979
+bool isRunning() const
Definition: wrapper.hpp:987
void setWorkerInput(const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:325
float renderThreshold
Definition: wrapperStructFace.hpp:52