1 #ifndef OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP
2 #define OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP
28 const WrapperStructFace& wrapperStructFace,
29 const WrapperStructHand& wrapperStructHand,
30 const WrapperStructExtra& wrapperStructExtra,
31 const WrapperStructInput& wrapperStructInput,
32 const WrapperStructOutput& wrapperStructOutput,
33 const bool renderOutput,
34 const bool userOutputWsEmpty,
45 OP_API void threadIdPP(
unsigned long long& threadId,
const bool multiThreadEnabled);
53 template<
typename TDatums,
54 typename TDatumsSP = std::shared_ptr<TDatums>,
55 typename TWorker = std::shared_ptr<Worker<TDatumsSP>>>
57 ThreadManager<TDatumsSP>& threadManager,
const bool multiThreadEnabled,
58 const ThreadManagerMode threadManagerMode,
const WrapperStructPose& wrapperStructPose,
59 const WrapperStructFace& wrapperStructFace,
const WrapperStructHand& wrapperStructHand,
60 const WrapperStructExtra& wrapperStructExtra,
const WrapperStructInput& wrapperStructInput,
61 const WrapperStructOutput& wrapperStructOutput,
85 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
100 auto wrapperStructPose = wrapperStructPoseTemp;
101 auto multiThreadEnabled = multiThreadEnabledTemp;
104 TWorker datumProducerW;
105 TWorker scaleAndSizeExtractorW;
106 TWorker cvMatToOpInputW;
107 TWorker cvMatToOpOutputW;
108 std::vector<std::vector<TWorker>> poseExtractorsWs;
109 std::vector<std::vector<TWorker>> poseTriangulationsWs;
110 std::vector<std::vector<TWorker>> jointAngleEstimationsWs;
111 std::vector<TWorker> postProcessingWs;
112 std::vector<TWorker> outputWs;
124 const auto spVideoSeek = std::make_shared<std::pair<std::atomic<bool>, std::atomic<int>>>();
126 spVideoSeek->first =
false;
127 spVideoSeek->second = 0;
133 const auto renderOutputGpu = wrapperStructPose.renderMode ==
RenderMode::Gpu
141 const auto userOutputWsEmpty = userOutputWs.empty();
143 wrapperStructInput, wrapperStructOutput, renderOutput, userOutputWsEmpty,
147 auto numberThreads = wrapperStructPose.gpuNumber;
148 auto gpuNumberStart = wrapperStructPose.gpuNumberStart;
152 numberThreads = (wrapperStructPose.gpuNumber == 0 ? 0 : 1);
157 multiThreadEnabled =
false;
165 if (numberThreads < 0)
167 if (totalGpuNumber <= gpuNumberStart)
168 error(
"Number of initial GPU (`--number_gpu_start`) must be lower than the total number of"
169 " used GPUs (`--number_gpu`)", __LINE__, __FUNCTION__, __FILE__);
170 numberThreads = totalGpuNumber - gpuNumberStart;
173 log(
"Auto-detecting all available GPUs... Detected " + std::to_string(totalGpuNumber)
174 +
" GPU(s), using " + std::to_string(numberThreads) +
" of them starting at GPU "
178 if (gpuNumberStart + numberThreads > totalGpuNumber)
179 error(
"Initial GPU selected (`--number_gpu_start`) + number GPUs to use (`--number_gpu`) must"
180 " be lower or equal than the total number of GPUs in your machine ("
181 + std::to_string(gpuNumberStart) +
" + "
182 + std::to_string(numberThreads) +
" vs. "
183 + std::to_string(totalGpuNumber) +
").",
184 __LINE__, __FUNCTION__, __FILE__);
195 auto finalOutputSize = wrapperStructPose.outputSize;
203 wrapperStructInput.
producerSharedPtr->setProducerFpsMode(displayProducerFpsMode);
212 if (finalOutputSize.x == -1 || finalOutputSize.y == -1)
213 finalOutputSize = producerSize;
219 const auto datumProducer = std::make_shared<DatumProducer<TDatums>>(
221 wrapperStructInput.
frameLast, spVideoSeek
223 datumProducerW = std::make_shared<WDatumProducer<TDatumsSP, TDatums>>(datumProducer);
226 datumProducerW =
nullptr;
228 std::vector<std::shared_ptr<PoseExtractorNet>> poseExtractorNets;
229 std::vector<std::shared_ptr<FaceExtractorNet>> faceExtractorNets;
230 std::vector<std::shared_ptr<HandExtractorNet>> handExtractorNets;
231 std::vector<std::shared_ptr<PoseGpuRenderer>> poseGpuRenderers;
232 std::shared_ptr<PoseCpuRenderer> poseCpuRenderer;
233 if (numberThreads > 0)
236 const auto scaleAndSizeExtractor = std::make_shared<ScaleAndSizeExtractor>(
237 wrapperStructPose.netInputSize, finalOutputSize, wrapperStructPose.scalesNumber,
238 wrapperStructPose.scaleGap
240 scaleAndSizeExtractorW = std::make_shared<WScaleAndSizeExtractor<TDatumsSP>>(scaleAndSizeExtractor);
243 const auto cvMatToOpInput = std::make_shared<CvMatToOpInput>(wrapperStructPose.poseModel);
244 cvMatToOpInputW = std::make_shared<WCvMatToOpInput<TDatumsSP>>(cvMatToOpInput);
247 const auto cvMatToOpOutput = std::make_shared<CvMatToOpOutput>();
248 cvMatToOpOutputW = std::make_shared<WCvMatToOpOutput<TDatumsSP>>(cvMatToOpOutput);
252 std::vector<TWorker> cpuRenderers;
253 poseExtractorsWs.clear();
254 poseExtractorsWs.resize(numberThreads);
255 if (wrapperStructPose.enable)
258 for (
auto gpuId = 0; gpuId < numberThreads; gpuId++)
259 poseExtractorNets.emplace_back(std::make_shared<PoseExtractorCaffe>(
260 wrapperStructPose.poseModel, modelFolder, gpuId + gpuNumberStart,
261 wrapperStructPose.heatMapTypes, wrapperStructPose.heatMapScale,
262 wrapperStructPose.addPartCandidates, wrapperStructPose.enableGoogleLogging
266 if (renderOutputGpu || wrapperStructPose.renderMode ==
RenderMode::Cpu)
270 const auto alphaKeypoint = (wrapperStructPose.renderMode !=
RenderMode::None
271 ? wrapperStructPose.alphaKeypoint : 0.f);
273 ? wrapperStructPose.alphaHeatMap : 0.f);
277 for (
const auto& poseExtractorNet : poseExtractorNets)
279 poseGpuRenderers.emplace_back(std::make_shared<PoseGpuRenderer>(
280 wrapperStructPose.poseModel, poseExtractorNet, wrapperStructPose.renderThreshold,
281 wrapperStructPose.blendOriginalFrame, alphaKeypoint,
282 alphaHeatMap, wrapperStructPose.defaultPartToRender
289 poseCpuRenderer = std::make_shared<PoseCpuRenderer>(
290 wrapperStructPose.poseModel, wrapperStructPose.renderThreshold,
291 wrapperStructPose.blendOriginalFrame, alphaKeypoint, alphaHeatMap,
292 wrapperStructPose.defaultPartToRender);
299 poseExtractorsWs.resize(poseExtractorNets.size());
301 ? std::make_shared<PersonIdExtractor>() :
nullptr);
308 const auto keepTopNPeople = (wrapperStructPose.numberPeopleMax > 0 ?
309 std::make_shared<KeepTopNPeople>(wrapperStructPose.numberPeopleMax)
312 auto personTrackers = std::make_shared<std::vector<std::shared_ptr<PersonTracker>>>();
313 if (wrapperStructExtra.
tracking > -1)
314 personTrackers->emplace_back(
315 std::make_shared<PersonTracker>(wrapperStructExtra.
tracking == 0));
316 for (
auto i = 0u; i < poseExtractorsWs.size(); i++)
320 const auto poseExtractor = std::make_shared<PoseExtractor>(
321 poseExtractorNets.at(i), keepTopNPeople, personIdExtractor, personTrackers,
322 wrapperStructPose.numberPeopleMax, wrapperStructExtra.
tracking);
323 poseExtractorsWs.at(i) = {std::make_shared<WPoseExtractor<TDatumsSP>>(poseExtractor)};
345 if (wrapperStructFace.
enable)
349 if (wrapperStructPose.enable)
351 const auto faceDetector = std::make_shared<FaceDetector>(wrapperStructPose.poseModel);
352 for (
auto& wPose : poseExtractorsWs)
358 log(
"Body keypoint detection is disabled. Hence, using OpenCV face detector (much less"
360 for (
auto& wPose : poseExtractorsWs)
363 const auto faceDetectorOpenCV = std::make_shared<FaceDetectorOpenCV>(modelFolder);
370 for (
auto gpu = 0u; gpu < poseExtractorsWs.size(); gpu++)
373 const auto netOutputSize = wrapperStructFace.
netInputSize;
374 const auto faceExtractorNet = std::make_shared<FaceExtractorCaffe>(
375 wrapperStructFace.
netInputSize, netOutputSize, modelFolder,
376 gpu + gpuNumberStart, wrapperStructPose.heatMapTypes, wrapperStructPose.heatMapScale,
377 wrapperStructPose.enableGoogleLogging
379 faceExtractorNets.emplace_back(faceExtractorNet);
380 poseExtractorsWs.at(gpu).emplace_back(
386 if (wrapperStructHand.
enable)
388 const auto handDetector = std::make_shared<HandDetector>(wrapperStructPose.poseModel);
389 for (
auto gpu = 0u; gpu < poseExtractorsWs.size(); gpu++)
394 poseExtractorsWs.at(gpu).emplace_back(
399 poseExtractorsWs.at(gpu).emplace_back(
402 const auto netOutputSize = wrapperStructHand.
netInputSize;
403 const auto handExtractorNet = std::make_shared<HandExtractorCaffe>(
404 wrapperStructHand.
netInputSize, netOutputSize, modelFolder,
406 wrapperStructPose.heatMapTypes, wrapperStructPose.heatMapScale,
407 wrapperStructPose.enableGoogleLogging
409 handExtractorNets.emplace_back(handExtractorNet);
410 poseExtractorsWs.at(gpu).emplace_back(
415 poseExtractorsWs.at(gpu).emplace_back(
422 if (!poseGpuRenderers.empty())
423 for (
auto i = 0u; i < poseExtractorsWs.size(); i++)
425 poseGpuRenderers.at(i)
435 const auto faceRenderer = std::make_shared<FaceCpuRenderer>(wrapperStructFace.
renderThreshold,
444 for (
auto i = 0u; i < poseExtractorsWs.size(); i++)
447 const auto faceRenderer = std::make_shared<FaceGpuRenderer>(
452 if (!poseGpuRenderers.empty())
454 const bool isLastRenderer = !renderHandGpu;
456 poseGpuRenderers.at(i)
462 poseExtractorsWs.at(i).emplace_back(
467 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
477 const auto handRenderer = std::make_shared<HandCpuRenderer>(wrapperStructHand.
renderThreshold,
486 for (
auto i = 0u; i < poseExtractorsWs.size(); i++)
489 const auto handRenderer = std::make_shared<HandGpuRenderer>(
494 if (!poseGpuRenderers.empty())
496 const bool isLastRenderer =
true;
498 poseGpuRenderers.at(i)
504 poseExtractorsWs.at(i).emplace_back(
509 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
513 poseTriangulationsWs.clear();
517 poseTriangulationsWs.resize(
fastMax(1,
int(poseExtractorsWs.size() / 4)));
518 for (
auto i = 0u ; i < poseTriangulationsWs.size() ; i++)
520 const auto poseTriangulation = std::make_shared<PoseTriangulation>(
522 poseTriangulationsWs.at(i) = {std::make_shared<WPoseTriangulation<TDatumsSP>>(
527 postProcessingWs.clear();
539 postProcessingWs =
mergeVectors(postProcessingWs, cpuRenderers);
540 const auto opOutputToCvMat = std::make_shared<OpOutputToCvMat>();
548 (finalOutputSize == producerSize || finalOutputSize.x <= 0 || finalOutputSize.y <= 0))
551 && producerSize == wrapperStructPose.netInputSize))
554 auto keypointScaler = std::make_shared<KeypointScaler>(wrapperStructPose.keypointScale);
563 jointAngleEstimationsWs.clear();
564 #ifdef USE_3D_ADAM_MODEL
567 jointAngleEstimationsWs.resize(wrapperStructExtra.
ikThreads);
569 for (
auto i = 0u; i < jointAngleEstimationsWs.size(); i++)
571 const auto jointAngleEstimation = std::make_shared<JointAngleEstimation>(displayAdam);
572 jointAngleEstimationsWs.at(i) = {std::make_shared<WJointAngleEstimation<TDatumsSP>>(
573 jointAngleEstimation)};
581 #ifdef USE_3D_ADAM_MODEL
582 if (!wrapperStructOutput.
udpHost.empty() && !wrapperStructOutput.
udpPort.empty())
584 const auto udpSender = std::make_shared<UdpSender>(wrapperStructOutput.
udpHost,
590 if (!writeKeypointCleaned.empty())
592 const auto keypointSaver = std::make_shared<KeypointSaver>(writeKeypointCleaned,
595 if (wrapperStructFace.
enable)
597 if (wrapperStructHand.
enable)
602 if (!writeJsonCleaned.empty())
604 const auto peopleJsonSaver = std::make_shared<PeopleJsonSaver>(writeJsonCleaned);
611 const auto humanFormat =
true;
612 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoJson,
620 const auto humanFormat =
true;
621 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoFootJson,
626 if (!writeImagesCleaned.empty())
628 const auto imageSaver = std::make_shared<ImageSaver>(writeImagesCleaned,
635 const auto originalVideoFps = (wrapperStructOutput.
writeVideoFps > 0 ?
641 error(
"Video file can only be recorded inside `wrapper/wrapper.hpp` if the producer"
642 " is one of the default ones (e.g. video, webcam, ...).",
643 __LINE__, __FUNCTION__, __FILE__);
644 if (finalOutputSize.x <= 0 || finalOutputSize.y <= 0)
645 error(
"Video can only be recorded if outputSize is fixed (e.g. video, webcam, IP camera),"
646 "but not for a image directory.", __LINE__, __FUNCTION__, __FILE__);
647 const auto videoSaver = std::make_shared<VideoSaver>(
648 wrapperStructOutput.
writeVideo, CV_FOURCC(
'M',
'J',
'P',
'G'), originalVideoFps, finalOutputSize
653 #ifdef USE_3D_ADAM_MODEL
654 if (!wrapperStructOutput.
writeBvh.empty())
656 const auto bvhSaver = std::make_shared<BvhSaver>(
657 wrapperStructOutput.
writeBvh, JointAngleEstimation::getTotalModel(), originalVideoFps
659 outputWs.emplace_back(std::make_shared<WBvhSaver<TDatumsSP>>(bvhSaver));
663 if (!writeHeatMapsCleaned.empty())
665 const auto heatMapSaver = std::make_shared<HeatMapSaver>(writeHeatMapsCleaned,
673 if (wrapperStructOutput.
guiVerbose && (guiEnabled || !userOutputWs.empty()
677 const auto guiInfoAdder = std::make_shared<GuiInfoAdder>(numberThreads, guiEnabled);
685 std::vector<std::shared_ptr<Renderer>> renderers;
687 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseCpuRenderer));
689 for (
const auto& poseGpuRenderer : poseGpuRenderers)
690 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseGpuRenderer));
695 #ifdef USE_3D_ADAM_MODEL
697 const auto gui = std::make_shared<GuiAdam>(
699 spVideoSeek, poseExtractorNets, faceExtractorNets, handExtractorNets, renderers,
700 wrapperStructOutput.
displayMode, JointAngleEstimation::getTotalModel(),
704 guiW = {std::make_shared<WGuiAdam<TDatumsSP>>(gui)};
712 const auto gui = std::make_shared<Gui3D>(
714 spVideoSeek, poseExtractorNets, faceExtractorNets, handExtractorNets, renderers,
715 wrapperStructPose.poseModel, wrapperStructOutput.
displayMode
718 guiW = {std::make_shared<WGui3D<TDatumsSP>>(gui)};
724 const auto gui = std::make_shared<Gui>(
726 spVideoSeek, poseExtractorNets, faceExtractorNets, handExtractorNets, renderers
729 guiW = {std::make_shared<WGui<TDatumsSP>>(gui)};
732 error(
"Unknown DisplayMode.", __LINE__, __FUNCTION__, __FILE__);
744 if ((datumProducerW ==
nullptr) == (userInputWs.empty())
748 const auto message =
"You need to have 1 and only 1 producer selected. You can introduce your own"
749 " producer by using setWorker(WorkerType::Input, ...) or use the OpenPose"
750 " default producer by configuring it in the configure function) or use the"
751 " ThreadManagerMode::Asynchronous(In) mode.";
752 error(message, __LINE__, __FUNCTION__, __FILE__);
754 if (outputWs.empty() && userOutputWs.empty() && guiW ==
nullptr
758 error(
"No output selected.", __LINE__, __FUNCTION__, __FILE__);
763 threadManager.
reset();
764 unsigned long long threadId = 0ull;
766 auto queueOut = 1ull;
769 const auto wIdGenerator = std::make_shared<WIdGenerator<TDatumsSP>>();
770 std::vector<TWorker> workersAux{wIdGenerator};
772 if (scaleAndSizeExtractorW !=
nullptr)
773 workersAux =
mergeVectors(workersAux, {scaleAndSizeExtractorW});
774 if (cvMatToOpInputW !=
nullptr)
775 workersAux =
mergeVectors(workersAux, {cvMatToOpInputW});
777 if (cvMatToOpOutputW !=
nullptr)
778 workersAux =
mergeVectors(workersAux, {cvMatToOpOutputW});
782 if (!userInputWs.empty() && userInputWsOnNewThread)
786 threadManager.
add(threadId, userInputWs, queueIn++, queueOut++);
790 else if (!userInputWs.empty())
793 else if (datumProducerW !=
nullptr)
794 workersAux =
mergeVectors({datumProducerW}, workersAux);
798 error(
"No input selected.", __LINE__, __FUNCTION__, __FILE__);
801 threadManager.
add(threadId, workersAux, queueIn++, queueOut++);
807 if (!poseExtractorsWs.empty())
809 if (multiThreadEnabled)
811 for (
auto& wPose : poseExtractorsWs)
814 threadManager.
add(threadId, wPose, queueIn, queueOut);
820 if (poseExtractorsWs.size() > 1u)
822 const auto wQueueOrderer = std::make_shared<WQueueOrderer<TDatumsSP>>();
824 threadManager.
add(threadId, wQueueOrderer, queueIn++, queueOut++);
830 if (poseExtractorsWs.size() > 1)
831 log(
"Multi-threading disabled, only 1 thread running. All GPUs have been disabled but the"
832 " first one, which is defined by gpuNumberStart (e.g. in the OpenPose demo, it is set"
835 threadManager.
add(threadId, poseExtractorsWs.at(0), queueIn++, queueOut++);
839 const auto wQueueAssembler = std::make_shared<WQueueAssembler<TDatumsSP, TDatums>>();
841 if (!poseTriangulationsWs.empty())
845 threadManager.
add(threadId, wQueueAssembler, queueIn++, queueOut++);
848 if (multiThreadEnabled)
850 for (
auto& wPoseTriangulations : poseTriangulationsWs)
853 threadManager.
add(threadId, wPoseTriangulations, queueIn, queueOut);
859 if (poseTriangulationsWs.size() > 1u)
861 const auto wQueueOrderer = std::make_shared<WQueueOrderer<TDatumsSP>>();
863 threadManager.
add(threadId, wQueueOrderer, queueIn++, queueOut++);
869 if (poseTriangulationsWs.size() > 1)
870 log(
"Multi-threading disabled, only 1 thread running for 3-D triangulation.",
873 threadManager.
add(threadId, poseTriangulationsWs.at(0), queueIn++, queueOut++);
877 postProcessingWs =
mergeVectors({wQueueAssembler}, postProcessingWs);
879 if (!jointAngleEstimationsWs.empty())
881 if (multiThreadEnabled)
883 for (
auto& wJointAngleEstimator : jointAngleEstimationsWs)
886 threadManager.
add(threadId, wJointAngleEstimator, queueIn, queueOut);
892 if (jointAngleEstimationsWs.size() > 1)
894 const auto wQueueOrderer = std::make_shared<WQueueOrderer<TDatumsSP>>();
896 threadManager.
add(threadId, wQueueOrderer, queueIn++, queueOut++);
902 if (jointAngleEstimationsWs.size() > 1)
903 log(
"Multi-threading disabled, only 1 thread running for joint angle estimation.",
906 threadManager.
add(threadId, jointAngleEstimationsWs.at(0), queueIn++, queueOut++);
910 if (!postProcessingWs.empty())
920 if (!userPostProcessingWs.empty())
923 if (userPostProcessingWsOnNewThread)
926 threadManager.
add(threadId, userPostProcessingWs, queueIn++, queueOut++);
932 outputWs =
mergeVectors(outputWs, userPostProcessingWs);
935 if (!outputWs.empty())
939 threadManager.
add(threadId, outputWs, queueIn++, queueOut++);
944 if (!userOutputWs.empty())
946 if (userOutputWsOnNewThread)
949 threadManager.
add(threadId, userOutputWs, queueIn++, queueOut++);
955 threadManager.
add(threadId-1, userOutputWs, queueIn++, queueOut++);
963 threadManager.
add(threadId, guiW, queueIn++, queueOut++);
968 catch (
const std::exception& e)
970 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
975 #endif // OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP
OP_API void threadIdPP(unsigned long long &threadId, const bool multiThreadEnabled)
Definition: wHandDetectorTracking.hpp:11
Definition: wGuiInfoAdder.hpp:11
std::array< T, N > array
Definition: cl2.hpp:594
float alphaHeatMap
Definition: wrapperStructFace.hpp:46
bool guiVerbose
Definition: wrapperStructOutput.hpp:31
std::string writeHeatMapsFormat
Definition: wrapperStructOutput.hpp:106
Definition: wPoseSaver.hpp:12
Definition: wrapperStructPose.hpp:17
std::string writeKeypoint
Definition: wrapperStructOutput.hpp:44
float alphaKeypoint
Definition: wrapperStructFace.hpp:39
Definition: wFaceSaver.hpp:12
float alphaKeypoint
Definition: wrapperStructHand.hpp:61
Definition: wPeopleJsonSaver.hpp:11
Definition: wHandRenderer.hpp:11
double writeVideoFps
Definition: wrapperStructOutput.hpp:111
Definition: wImageSaver.hpp:11
std::string udpPort
Definition: wrapperStructOutput.hpp:135
std::string writeImages
Definition: wrapperStructOutput.hpp:78
std::shared_ptr< std::atomic< bool > > getIsRunningSharedPtr()
Definition: threadManager.hpp:40
T fastMax(const T a, const T b)
Definition: fastMath.hpp:70
float alphaHeatMap
Definition: wrapperStructHand.hpp:68
Definition: wKeypointScaler.hpp:11
std::string writeHeatMaps
Definition: wrapperStructOutput.hpp:100
std::string writeCocoJson
Definition: wrapperStructOutput.hpp:67
void add(const unsigned long long threadId, const std::vector< TWorker > &tWorkers, const unsigned long long queueInId, const unsigned long long queueOutId)
Definition: threadManager.hpp:125
Definition: wFaceDetector.hpp:11
void reset()
Definition: threadManager.hpp:157
Definition: wrapperStructFace.hpp:15
OP_API void wrapperConfigureSanityChecks(WrapperStructPose &wrapperStructPose, const WrapperStructFace &wrapperStructFace, const WrapperStructHand &wrapperStructHand, const WrapperStructExtra &wrapperStructExtra, const WrapperStructInput &wrapperStructInput, const WrapperStructOutput &wrapperStructOutput, const bool renderOutput, const bool userOutputWsEmpty, const ThreadManagerMode threadManagerMode)
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
std::string udpHost
Definition: wrapperStructOutput.hpp:130
DataFormat writeKeypointFormat
Definition: wrapperStructOutput.hpp:51
std::string writeCocoFootJson
Definition: wrapperStructOutput.hpp:72
RenderMode renderMode
Definition: wrapperStructPose.hpp:81
float scaleRange
Definition: wrapperStructHand.hpp:41
OP_API GpuMode getGpuMode()
RenderMode renderMode
Definition: wrapperStructFace.hpp:33
bool tracking
Definition: wrapperStructHand.hpp:49
bool enable
Definition: wrapperStructFace.hpp:20
Definition: wFaceDetectorOpenCV.hpp:11
Definition: wVideoSaver.hpp:11
Definition: wUdpSender.hpp:11
Definition: wOpOutputToCvMat.hpp:11
OP_API std::string formatAsDirectory(const std::string &directoryPathString)
Definition: wHandDetectorUpdate.hpp:11
Definition: wHandExtractorNet.hpp:11
std::string writeBvh
Definition: wrapperStructOutput.hpp:125
Definition: wFaceRenderer.hpp:11
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
Definition: wrapperStructHand.hpp:15
float renderThreshold
Definition: wrapperStructHand.hpp:76
Definition: poseGpuRenderer.hpp:13
Definition: wHandDetector.hpp:11
std::string writeVideoAdam
Definition: wrapperStructOutput.hpp:118
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:93
DisplayMode displayMode
Definition: wrapperStructOutput.hpp:25
Point< int > netInputSize
Definition: wrapperStructFace.hpp:27
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: wHeatMapSaver.hpp:11
bool enable
Definition: wrapperStructHand.hpp:20
ThreadManagerMode
Definition: enumClasses.hpp:9
OP_API void configureThreadManager(ThreadManager< TDatumsSP > &threadManager, const bool multiThreadEnabled, const ThreadManagerMode threadManagerMode, const WrapperStructPose &wrapperStructPose, const WrapperStructFace &wrapperStructFace, const WrapperStructHand &wrapperStructHand, const WrapperStructExtra &wrapperStructExtra, const WrapperStructInput &wrapperStructInput, const WrapperStructOutput &wrapperStructOutput, const std::array< std::vector< TWorker >, int(WorkerType::Size)> &userWs, const std::array< bool, int(WorkerType::Size)> &userWsOnNewThread)
Definition: wrapperAuxiliary.hpp:86
#define OP_API
Definition: macros.hpp:18
float renderThreshold
Definition: wrapperStructFace.hpp:54
std::string writeImagesFormat
Definition: wrapperStructOutput.hpp:86
Definition: wrapperStructOutput.hpp:14
OP_API int getGpuNumber()
Point< int > netInputSize
Definition: wrapperStructHand.hpp:27
int scalesNumber
Definition: wrapperStructHand.hpp:35
RenderMode renderMode
Definition: wrapperStructHand.hpp:55