1 #ifndef OPENPOSE_WRAPPER_WRAPPER_HPP
2 #define OPENPOSE_WRAPPER_WRAPPER_HPP
29 template<
typename TDatums,
30 typename TWorker = std::shared_ptr<Worker<std::shared_ptr<TDatums>>>,
31 typename TQueue = Queue<std::shared_ptr<TDatums>>>
64 void setWorkerInput(
const TWorker& worker,
const bool workerOnNewThread =
true);
80 void setWorkerOutput(
const TWorker& worker,
const bool workerOnNewThread =
true);
157 bool tryEmplace(std::shared_ptr<TDatums>& tDatums);
175 bool tryPush(
const std::shared_ptr<TDatums>& tDatums);
183 bool waitAndPush(
const std::shared_ptr<TDatums>& tDatums);
192 bool tryPop(std::shared_ptr<TDatums>& tDatums);
202 bool waitAndPop(std::shared_ptr<TDatums>& tDatums);
206 const std::shared_ptr<std::pair<std::atomic<bool>, std::atomic<int>>> spVideoSeek;
209 bool mUserInputWsOnNewThread;
210 bool mUserPostProcessingWsOnNewThread;
211 bool mUserOutputWsOnNewThread;
212 unsigned long long mThreadId;
213 bool mMultiThreadEnabled;
215 std::vector<TWorker> mUserInputWs;
216 TWorker wDatumProducer;
217 TWorker spWIdGenerator;
218 TWorker spWScaleAndSizeExtractor;
219 TWorker spWCvMatToOpInput;
220 TWorker spWCvMatToOpOutput;
221 std::vector<std::vector<TWorker>> spWPoses;
222 std::vector<TWorker> mPostProcessingWs;
223 std::vector<TWorker> mUserPostProcessingWs;
224 std::vector<TWorker> mOutputWs;
226 std::vector<TWorker> mUserOutputWs;
242 void configureThreadManager();
251 unsigned long long threadIdPP();
277 template<
typename TDatums,
typename TWorker,
typename TQueue>
279 mThreadManagerMode{threadManagerMode},
280 spVideoSeek{std::make_shared<std::pair<std::atomic<bool>, std::atomic<int>>>()},
282 mThreadManager{threadManagerMode},
283 mMultiThreadEnabled{
true}
288 spVideoSeek->first =
false;
289 spVideoSeek->second = 0;
291 catch (
const std::exception& e)
293 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
297 template<
typename TDatums,
typename TWorker,
typename TQueue>
305 catch (
const std::exception& e)
307 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
311 template<
typename TDatums,
typename TWorker,
typename TQueue>
316 mMultiThreadEnabled =
false;
318 catch (
const std::exception& e)
320 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
324 template<
typename TDatums,
typename TWorker,
typename TQueue>
329 mUserInputWs.clear();
330 if (worker ==
nullptr)
331 error(
"Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
332 mUserInputWs.emplace_back(worker);
333 mUserInputWsOnNewThread = {workerOnNewThread};
335 catch (
const std::exception& e)
337 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
341 template<
typename TDatums,
typename TWorker,
typename TQueue>
343 const bool workerOnNewThread)
347 mUserPostProcessingWs.clear();
348 if (worker ==
nullptr)
349 error(
"Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
350 mUserPostProcessingWs.emplace_back(worker);
351 mUserPostProcessingWsOnNewThread = {workerOnNewThread};
353 catch (
const std::exception& e)
355 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
359 template<
typename TDatums,
typename TWorker,
typename TQueue>
364 mUserOutputWs.clear();
365 if (worker ==
nullptr)
366 error(
"Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
367 mUserOutputWs.emplace_back(worker);
368 mUserOutputWsOnNewThread = {workerOnNewThread};
370 catch (
const std::exception& e)
372 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
376 template<
typename TDatums,
typename TWorker,
typename TQueue>
384 wrapperStructInput, wrapperStructOutput);
386 catch (
const std::exception& e)
388 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
392 template<
typename TDatums,
typename TWorker,
typename TQueue>
401 wrapperStructInput, wrapperStructOutput);
403 catch (
const std::exception& e)
405 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
409 template<
typename TDatums,
typename TWorker,
typename TQueue>
418 wrapperStructInput, wrapperStructOutput);
420 catch (
const std::exception& e)
422 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
426 template<
typename TDatums,
typename TWorker,
typename TQueue>
438 typedef std::shared_ptr<TDatums> TDatumsPtr;
452 const auto userOutputWsEmpty = mUserOutputWs.empty();
454 wrapperStructOutput, renderOutput, userOutputWsEmpty, mThreadManagerMode);
457 auto numberThreads = wrapperStructPose.
gpuNumber;
462 numberThreads = (wrapperStructPose.
gpuNumber == 0 ? 0 : 1);
467 disableMultiThreading();
473 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__);
480 numberThreads = totalGpuNumber - gpuNumberStart;
483 log(
"Auto-detecting all available GPUs... Detected " + std::to_string(totalGpuNumber)
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>();
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"
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(
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);
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);
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
PoseModel poseModel
Definition: wrapperStructPose.hpp:88
Point< int > netInputSize
Definition: wrapperStructPose.hpp:31
float alphaHeatMap
Definition: wrapperStructPose.hpp:106
Definition: wHandDetectorTracking.hpp:11
Wrapper(const ThreadManagerMode threadManagerMode=ThreadManagerMode::Synchronous)
Definition: wrapper.hpp:278
Definition: wGuiInfoAdder.hpp:11
float alphaHeatMap
Definition: wrapperStructFace.hpp:45
ScaleMode heatMapScale
Definition: wrapperStructPose.hpp:135
bool guiVerbose
Definition: wrapperStructOutput.hpp:31
std::vector< HeatMapType > heatMapTypes
Definition: wrapperStructPose.hpp:127
std::string writeHeatMapsFormat
Definition: wrapperStructOutput.hpp:101
bool addPartCandidates
Definition: wrapperStructPose.hpp:141
OP_API void wrapperConfigureSecurityChecks(const WrapperStructPose &wrapperStructPose, const WrapperStructFace &wrapperStructFace, const WrapperStructHand &wrapperStructHand, const WrapperStructInput &wrapperStructInput, const WrapperStructOutput &wrapperStructOutput, const bool renderOutput, const bool userOutputWsEmpty, const ThreadManagerMode threadManagerMode)
Definition: wPoseSaver.hpp:12
bool identification
Definition: wrapperStructPose.hpp:181
bool tryPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1027
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
float alphaKeypoint
Definition: wrapperStructHand.hpp:59
bool tryPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1061
void exec()
Definition: wrapper.hpp:936
Definition: wPeopleJsonSaver.hpp:11
int defaultPartToRender
Definition: wrapperStructPose.hpp:115
Definition: wHandRenderer.hpp:11
void setWorkerPostProcessing(const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:342
Definition: wImageSaver.hpp:11
std::string writeImages
Definition: wrapperStructOutput.hpp:73
float alphaHeatMap
Definition: wrapperStructHand.hpp:65
Definition: wKeypointScaler.hpp:11
std::string writeHeatMaps
Definition: wrapperStructOutput.hpp:95
std::string writeCocoJson
Definition: wrapperStructOutput.hpp:67
Definition: wFaceDetector.hpp:11
bool enable
Definition: wrapperStructPose.hpp:24
Definition: wrapperStructFace.hpp:15
Point< int > outputSize
Definition: wrapperStructPose.hpp:39
OP_API void error(const std::string &message, const int line=-1, const std::string &function="", const std::string &file="")
bool fullScreen
Definition: wrapperStructOutput.hpp:37
Definition: wKeepTopNPeople.hpp:11
DataFormat writeKeypointFormat
Definition: wrapperStructOutput.hpp:51
float scaleGap
Definition: wrapperStructPose.hpp:75
RenderMode renderMode
Definition: wrapperStructPose.hpp:81
bool waitAndEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1010
Definition: wrapper.hpp:32
bool tryEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:993
float scaleRange
Definition: wrapperStructHand.hpp:40
OP_API GpuMode getGpuMode()
int gpuNumberStart
Definition: wrapperStructPose.hpp:60
RenderMode renderMode
Definition: wrapperStructFace.hpp:33
bool tracking
Definition: wrapperStructHand.hpp:47
bool enable
Definition: wrapperStructFace.hpp:20
Definition: wFaceDetectorOpenCV.hpp:11
Definition: wQueueOrderer.hpp:12
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
OP_API std::string formatAsDirectory(const std::string &directoryPathString)
Definition: wHandExtractor.hpp:11
Definition: wHandDetectorUpdate.hpp:11
std::string modelFolder
Definition: wrapperStructPose.hpp:120
int numberPeopleMax
Definition: wrapperStructPose.hpp:159
void configure(const WrapperStructPose &wrapperStructPose, const WrapperStructInput &wrapperStructInput, const WrapperStructOutput &wrapperStructOutput=WrapperStructOutput{})
Definition: wrapper.hpp:377
int scalesNumber
Definition: wrapperStructPose.hpp:68
Definition: wFaceRenderer.hpp:11
bool waitAndPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1078
Definition: threadManager.hpp:16
Definition: wPoseRenderer.hpp:11
std::string writeJson
Definition: wrapperStructOutput.hpp:61
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="")
Definition: wCocoJsonSaver.hpp:11
~Wrapper()
Definition: wrapper.hpp:298
Definition: wrapperStructHand.hpp:15
float renderThreshold
Definition: wrapperStructHand.hpp:72
Definition: poseGpuRenderer.hpp:13
Definition: wHandDetector.hpp:11
bool enableGoogleLogging
Definition: wrapperStructPose.hpp:168
std::vector< T > mergeVectors(const std::vector< T > &vectorA, const std::vector< T > &vectorB)
Definition: standard.hpp:40
Definition: wHandSaver.hpp:12
std::string writeVideo
Definition: wrapperStructOutput.hpp:88
DisplayMode displayMode
Definition: wrapperStructOutput.hpp:25
Point< int > netInputSize
Definition: wrapperStructFace.hpp:27
float renderThreshold
Definition: wrapperStructPose.hpp:149
void setSharedParametersAndIfLast(const std::tuple< std::shared_ptr< float * >, std::shared_ptr< bool >, std::shared_ptr< std::atomic< unsigned int >>, std::shared_ptr< std::atomic< unsigned long long >>, std::shared_ptr< const unsigned int >> &tuple, const bool isLast)
Definition: wPoseTriangulation.hpp:11
float alphaKeypoint
Definition: wrapperStructPose.hpp:99
void setWorkerOutput(const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:360
Definition: wHeatMapSaver.hpp:11
bool enable
Definition: wrapperStructHand.hpp:20
ScaleMode keypointScale
Definition: wrapperStructPose.hpp:47
ThreadManagerMode
Definition: enumClasses.hpp:9
int gpuNumber
Definition: wrapperStructPose.hpp:54
bool isRunning() const
Definition: wrapper.hpp:979
void setWorkerInput(const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:325
float renderThreshold
Definition: wrapperStructFace.hpp:52
std::string writeImagesFormat
Definition: wrapperStructOutput.hpp:81
Definition: wrapperStructOutput.hpp:14
void disableMultiThreading()
Definition: wrapper.hpp:312
OP_API int getGpuNumber()
Point< int > netInputSize
Definition: wrapperStructHand.hpp:27
bool blendOriginalFrame
Definition: wrapperStructPose.hpp:93
bool reconstruct3d
Definition: wrapperStructPose.hpp:176
int scalesNumber
Definition: wrapperStructHand.hpp:34
RenderMode renderMode
Definition: wrapperStructHand.hpp:53