diff --git a/doxygen.log b/doxygen.log
index 58f40b22..caf3e0d5 100644
--- a/doxygen.log
+++ b/doxygen.log
@@ -901,5 +901,5 @@ Generating file index...
Generating file member index...
Generating example index...
finalizing index lists...
-lookup cache used 2782/65536 hits=16690 misses=2975
+lookup cache used 2781/65536 hits=16676 misses=2974
finished...
diff --git a/html/wrapper_8hpp_source.html b/html/wrapper_8hpp_source.html
index 4c6da109..c23615b2 100644
--- a/html/wrapper_8hpp_source.html
+++ b/html/wrapper_8hpp_source.html
@@ -506,803 +506,814 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
531 error(
"Body keypoint detection must be enabled in order to run hand keypoint detection.",
532 __LINE__, __FUNCTION__, __FILE__);
-
-
- 536 auto gpuNumber = wrapperStructPose.
gpuNumber;
-
-
-
-
-
-
- 543 if (totalGpuNumber <= gpuNumberStart)
- 544 error(
"Number of initial GPUs (`--number_gpu_start`) must be lower than the total number of used"
- 545 " GPUs (`--number_gpu`)", __LINE__, __FUNCTION__, __FILE__);
- 546 gpuNumber = totalGpuNumber - gpuNumberStart;
-
-
- 549 log(
"Auto-detecting all available GPUs... Detected " + std::to_string(totalGpuNumber)
- 550 +
" GPU(s), using " + std::to_string(gpuNumber) +
" of them starting at GPU "
-
-
-
-
-
-
-
-
-
-
-
- 562 auto finalOutputSize = wrapperStructPose.
outputSize;
-
-
-
-
-
-
- 569 wrapperStructInput.
producerSharedPtr->setProducerFpsMode(displayProducerFpsMode);
-
-
-
-
-
-
-
-
- 578 if (finalOutputSize.x == -1 || finalOutputSize.y == -1)
- 579 finalOutputSize = producerSize;
-
-
-
-
-
- 585 const auto datumProducer = std::make_shared<DatumProducer<TDatums>>(
-
-
-
- 589 wDatumProducer = std::make_shared<WDatumProducer<TDatumsPtr, TDatums>>(datumProducer);
-
-
- 592 wDatumProducer =
nullptr;
-
- 594 std::vector<std::shared_ptr<PoseExtractor>> poseExtractors;
- 595 std::vector<std::shared_ptr<PoseGpuRenderer>> poseGpuRenderers;
- 596 std::shared_ptr<PoseCpuRenderer> poseCpuRenderer;
-
-
-
- 600 const auto scaleAndSizeExtractor = std::make_shared<ScaleAndSizeExtractor>(
-
-
-
- 604 spWScaleAndSizeExtractor = std::make_shared<WScaleAndSizeExtractor<TDatumsPtr>>(scaleAndSizeExtractor);
-
-
- 607 const auto cvMatToOpInput = std::make_shared<CvMatToOpInput>();
- 608 spWCvMatToOpInput = std::make_shared<WCvMatToOpInput<TDatumsPtr>>(cvMatToOpInput);
-
-
- 611 const auto cvMatToOpOutput = std::make_shared<CvMatToOpOutput>();
- 612 spWCvMatToOpOutput = std::make_shared<WCvMatToOpOutput<TDatumsPtr>>(cvMatToOpOutput);
-
-
-
- 616 std::vector<TWorker> cpuRenderers;
-
- 618 spWPoses.resize(gpuNumber);
- 619 if (wrapperStructPose.
enable)
-
-
- 622 for (
auto gpuId = 0; gpuId < gpuNumber; gpuId++)
- 623 poseExtractors.emplace_back(std::make_shared<PoseExtractorCaffe>(
- 624 wrapperStructPose.
poseModel, modelFolder, gpuId + gpuNumberStart,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 641 for (
const auto& poseExtractor : poseExtractors)
-
- 643 poseGpuRenderers.emplace_back(std::make_shared<PoseGpuRenderer>(
-
-
-
-
-
-
-
-
-
- 653 poseCpuRenderer = std::make_shared<PoseCpuRenderer>(wrapperStructPose.
poseModel,
-
-
-
-
-
-
-
-
- 662 spWPoses.resize(poseExtractors.size());
- 663 for (
auto i = 0u; i < spWPoses.size(); i++)
- 664 spWPoses.at(i) = {std::make_shared<WPoseExtractor<TDatumsPtr>>(poseExtractors.at(i))};
-
-
-
-
- 669 if (wrapperStructFace.
enable)
-
-
-
- 673 if (wrapperStructPose.
enable)
-
- 675 const auto faceDetector = std::make_shared<FaceDetector>(wrapperStructPose.
poseModel);
- 676 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
-
-
-
- 682 log(
"Body keypoint detection is disabled. Hence, using OpenCV face detector (much less"
-
- 684 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
- 687 const auto faceDetectorOpenCV = std::make_shared<FaceDetectorOpenCV>(modelFolder);
- 688 spWPoses.at(gpu).emplace_back(
-
-
-
-
-
- 694 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
- 697 const auto netOutputSize = wrapperStructFace.
netInputSize;
- 698 const auto faceExtractor = std::make_shared<FaceExtractorCaffe>(
- 699 wrapperStructFace.
netInputSize, netOutputSize, modelFolder,
-
-
-
-
-
-
-
-
- 708 if (wrapperStructHand.
enable)
-
- 710 const auto handDetector = std::make_shared<HandDetector>(wrapperStructPose.
poseModel);
- 711 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
-
-
-
-
- 716 spWPoses.at(gpu).emplace_back(
-
-
-
-
-
-
- 723 const auto netOutputSize = wrapperStructHand.
netInputSize;
- 724 const auto handExtractor = std::make_shared<HandExtractorCaffe>(
- 725 wrapperStructHand.
netInputSize, netOutputSize, modelFolder,
-
-
-
-
- 730 spWPoses.at(gpu).emplace_back(
-
-
-
-
- 735 spWPoses.at(gpu).emplace_back(
-
-
-
-
-
-
- 742 if (!poseGpuRenderers.empty())
- 743 for (
auto i = 0u; i < spWPoses.size(); i++)
-
- 745 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 755 const auto faceRenderer = std::make_shared<FaceCpuRenderer>(wrapperStructFace.
renderThreshold,
-
-
-
-
-
-
-
-
- 764 for (
auto i = 0u; i < spWPoses.size(); i++)
-
-
- 767 const auto faceRenderer = std::make_shared<FaceGpuRenderer>(
-
-
-
-
- 772 if (!poseGpuRenderers.empty())
-
- 774 const bool isLastRenderer = !renderHandGpu;
-
- 776 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 786 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
-
-
-
-
-
- 796 const auto handRenderer = std::make_shared<HandCpuRenderer>(wrapperStructHand.
renderThreshold,
-
-
-
-
-
-
-
-
- 805 for (
auto i = 0u; i < spWPoses.size(); i++)
-
-
- 808 const auto handRenderer = std::make_shared<HandGpuRenderer>(
-
-
-
-
- 813 if (!poseGpuRenderers.empty())
-
- 815 const bool isLastRenderer =
true;
-
- 817 poseGpuRenderers.at(i)
-
-
-
-
-
-
-
-
-
- 827 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 831 mPostProcessingWs.clear();
-
- 833 if (spWPoses.size() > 1u)
-
-
-
-
- 838 const auto personIdExtractor = std::make_shared<PersonIdExtractor>();
- 839 mPostProcessingWs.emplace_back(
-
-
-
-
-
-
- 846 mPostProcessingWs =
mergeVectors(mPostProcessingWs, cpuRenderers);
- 847 const auto opOutputToCvMat = std::make_shared<OpOutputToCvMat>();
-
-
-
-
-
-
-
- 855 (finalOutputSize == producerSize || finalOutputSize.x <= 0 || finalOutputSize.y <= 0))
-
-
-
-
-
- 861 auto keypointScaler = std::make_shared<KeypointScaler>(wrapperStructPose.
keypointScale);
-
-
-
-
-
-
- 868 if (!writeKeypointCleaned.empty())
-
- 870 const auto keypointSaver = std::make_shared<KeypointSaver>(writeKeypointCleaned,
-
-
- 873 if (wrapperStructFace.
enable)
-
- 875 if (wrapperStructHand.
enable)
-
-
-
-
- 880 if (!writeJsonCleaned.empty())
-
- 882 const auto peopleJsonSaver = std::make_shared<PeopleJsonSaver>(writeJsonCleaned);
-
-
-
-
-
-
- 889 const auto humanFormat =
true;
- 890 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoJson,
-
-
-
-
- 895 if (!writeImagesCleaned.empty())
-
- 897 const auto imageSaver = std::make_shared<ImageSaver>(writeImagesCleaned,
-
-
-
-
-
-
- 904 if (finalOutputSize.x <= 0 || finalOutputSize.y <= 0)
- 905 error(
"Video can only be recorded if outputSize is fixed (e.g. video, webcam, IP camera),"
- 906 "but not for a image directory.", __LINE__, __FUNCTION__, __FILE__);
- 907 const auto originalVideoFps = (wrapperStructInput.
producerSharedPtr->get(CV_CAP_PROP_FPS) > 0.
-
- 909 const auto videoSaver = std::make_shared<VideoSaver>(
- 910 wrapperStructOutput.
writeVideo, CV_FOURCC(
'M',
'J',
'P',
'G'), originalVideoFps, finalOutputSize
-
-
-
-
- 915 if (!writeHeatMapsCleaned.empty())
-
- 917 const auto heatMapSaver = std::make_shared<HeatMapSaver>(writeHeatMapsCleaned,
-
-
-
-
-
-
-
-
-
+
+
+ 536 error(
"GPU number must be negative or 0 if CPU_ONLY is enabled.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+
+ 542 const auto numberThreads = (wrapperStructPose.
gpuNumber == 0 ? 0 : 1);
+ 543 const auto gpuNumberStart = 0;
+
+
+ 546 auto numberThreads = wrapperStructPose.
gpuNumber;
+
+
+ 549 if (numberThreads < 0)
+
+
+
+ 553 if (totalGpuNumber <= gpuNumberStart)
+ 554 error(
"Number of initial GPUs (`--number_gpu_start`) must be lower than the total number of used"
+ 555 " GPUs (`--number_gpu`)", __LINE__, __FUNCTION__, __FILE__);
+ 556 numberThreads = totalGpuNumber - gpuNumberStart;
+
+
+ 559 log(
"Auto-detecting all available GPUs... Detected " + std::to_string(totalGpuNumber)
+ 560 +
" GPU(s), using " + std::to_string(numberThreads) +
" of them starting at GPU "
+
+
+
+
+
+
+
+
+
+
+
+
+ 573 auto finalOutputSize = wrapperStructPose.
outputSize;
+
+
+
+
+
+
+ 580 wrapperStructInput.
producerSharedPtr->setProducerFpsMode(displayProducerFpsMode);
+
+
+
+
+
+
+
+
+ 589 if (finalOutputSize.x == -1 || finalOutputSize.y == -1)
+ 590 finalOutputSize = producerSize;
+
+
+
+
+
+ 596 const auto datumProducer = std::make_shared<DatumProducer<TDatums>>(
+
+
+
+ 600 wDatumProducer = std::make_shared<WDatumProducer<TDatumsPtr, TDatums>>(datumProducer);
+
+
+ 603 wDatumProducer =
nullptr;
+
+ 605 std::vector<std::shared_ptr<PoseExtractor>> poseExtractors;
+ 606 std::vector<std::shared_ptr<PoseGpuRenderer>> poseGpuRenderers;
+ 607 std::shared_ptr<PoseCpuRenderer> poseCpuRenderer;
+ 608 if (numberThreads > 0)
+
+
+ 611 const auto scaleAndSizeExtractor = std::make_shared<ScaleAndSizeExtractor>(
+
+
+
+ 615 spWScaleAndSizeExtractor = std::make_shared<WScaleAndSizeExtractor<TDatumsPtr>>(scaleAndSizeExtractor);
+
+
+ 618 const auto cvMatToOpInput = std::make_shared<CvMatToOpInput>();
+ 619 spWCvMatToOpInput = std::make_shared<WCvMatToOpInput<TDatumsPtr>>(cvMatToOpInput);
+
+
+ 622 const auto cvMatToOpOutput = std::make_shared<CvMatToOpOutput>();
+ 623 spWCvMatToOpOutput = std::make_shared<WCvMatToOpOutput<TDatumsPtr>>(cvMatToOpOutput);
+
+
+
+ 627 std::vector<TWorker> cpuRenderers;
+
+ 629 spWPoses.resize(numberThreads);
+ 630 if (wrapperStructPose.
enable)
+
+
+ 633 for (
auto gpuId = 0; gpuId < numberThreads; gpuId++)
+ 634 poseExtractors.emplace_back(std::make_shared<PoseExtractorCaffe>(
+ 635 wrapperStructPose.
poseModel, modelFolder, gpuId + gpuNumberStart,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 652 for (
const auto& poseExtractor : poseExtractors)
+
+ 654 poseGpuRenderers.emplace_back(std::make_shared<PoseGpuRenderer>(
+
+
+
+
+
+
+
+
+
+ 664 poseCpuRenderer = std::make_shared<PoseCpuRenderer>(wrapperStructPose.
poseModel,
+
+
+
+
+
+
+
+
+ 673 spWPoses.resize(poseExtractors.size());
+ 674 for (
auto i = 0u; i < spWPoses.size(); i++)
+ 675 spWPoses.at(i) = {std::make_shared<WPoseExtractor<TDatumsPtr>>(poseExtractors.at(i))};
+
+
+
+
+ 680 if (wrapperStructFace.
enable)
+
+
+
+ 684 if (wrapperStructPose.
enable)
+
+ 686 const auto faceDetector = std::make_shared<FaceDetector>(wrapperStructPose.
poseModel);
+ 687 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+
+
+
+ 693 log(
"Body keypoint detection is disabled. Hence, using OpenCV face detector (much less"
+
+ 695 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+ 698 const auto faceDetectorOpenCV = std::make_shared<FaceDetectorOpenCV>(modelFolder);
+ 699 spWPoses.at(gpu).emplace_back(
+
+
+
+
+
+ 705 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+ 708 const auto netOutputSize = wrapperStructFace.
netInputSize;
+ 709 const auto faceExtractor = std::make_shared<FaceExtractorCaffe>(
+ 710 wrapperStructFace.
netInputSize, netOutputSize, modelFolder,
+
+
+
+
+
+
+
+
+ 719 if (wrapperStructHand.
enable)
+
+ 721 const auto handDetector = std::make_shared<HandDetector>(wrapperStructPose.
poseModel);
+ 722 for (
auto gpu = 0u; gpu < spWPoses.size(); gpu++)
+
+
+
+
+ 727 spWPoses.at(gpu).emplace_back(
+
+
+
+
+
+
+ 734 const auto netOutputSize = wrapperStructHand.
netInputSize;
+ 735 const auto handExtractor = std::make_shared<HandExtractorCaffe>(
+ 736 wrapperStructHand.
netInputSize, netOutputSize, modelFolder,
+
+
+
+
+ 741 spWPoses.at(gpu).emplace_back(
+
+
+
+
+ 746 spWPoses.at(gpu).emplace_back(
+
+
+
+
+
+
+ 753 if (!poseGpuRenderers.empty())
+ 754 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+ 756 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 766 const auto faceRenderer = std::make_shared<FaceCpuRenderer>(wrapperStructFace.
renderThreshold,
+
+
+
+
+
+
+
+
+ 775 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+
+ 778 const auto faceRenderer = std::make_shared<FaceGpuRenderer>(
+
+
+
+
+ 783 if (!poseGpuRenderers.empty())
+
+ 785 const bool isLastRenderer = !renderHandGpu;
+
+ 787 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 797 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+
+
+
+
+
+ 807 const auto handRenderer = std::make_shared<HandCpuRenderer>(wrapperStructHand.
renderThreshold,
+
+
+
+
+
+
+
+
+ 816 for (
auto i = 0u; i < spWPoses.size(); i++)
+
+
+ 819 const auto handRenderer = std::make_shared<HandGpuRenderer>(
+
+
+
+
+ 824 if (!poseGpuRenderers.empty())
+
+ 826 const bool isLastRenderer =
true;
+
+ 828 poseGpuRenderers.at(i)
+
+
+
+
+
+
+
+
+
+ 838 error(
"Unknown RenderMode.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 842 mPostProcessingWs.clear();
+
+ 844 if (spWPoses.size() > 1u)
+
+
+
+
+ 849 const auto personIdExtractor = std::make_shared<PersonIdExtractor>();
+ 850 mPostProcessingWs.emplace_back(
+
+
+
+
+
+
+ 857 mPostProcessingWs =
mergeVectors(mPostProcessingWs, cpuRenderers);
+ 858 const auto opOutputToCvMat = std::make_shared<OpOutputToCvMat>();
+
+
+
+
+
+
+
+ 866 (finalOutputSize == producerSize || finalOutputSize.x <= 0 || finalOutputSize.y <= 0))
+
+
+
+
+
+ 872 auto keypointScaler = std::make_shared<KeypointScaler>(wrapperStructPose.
keypointScale);
+
+
+
+
+
+
+ 879 if (!writeKeypointCleaned.empty())
+
+ 881 const auto keypointSaver = std::make_shared<KeypointSaver>(writeKeypointCleaned,
+
+
+ 884 if (wrapperStructFace.
enable)
+
+ 886 if (wrapperStructHand.
enable)
+
+
+
+
+ 891 if (!writeJsonCleaned.empty())
+
+ 893 const auto peopleJsonSaver = std::make_shared<PeopleJsonSaver>(writeJsonCleaned);
+
+
+
+
+
+
+ 900 const auto humanFormat =
true;
+ 901 const auto cocoJsonSaver = std::make_shared<CocoJsonSaver>(wrapperStructOutput.
writeCocoJson,
+
+
+
+
+ 906 if (!writeImagesCleaned.empty())
+
+ 908 const auto imageSaver = std::make_shared<ImageSaver>(writeImagesCleaned,
+
+
+
+
+
+
+ 915 if (finalOutputSize.x <= 0 || finalOutputSize.y <= 0)
+ 916 error(
"Video can only be recorded if outputSize is fixed (e.g. video, webcam, IP camera),"
+ 917 "but not for a image directory.", __LINE__, __FUNCTION__, __FILE__);
+ 918 const auto originalVideoFps = (wrapperStructInput.
producerSharedPtr->get(CV_CAP_PROP_FPS) > 0.
+
+ 920 const auto videoSaver = std::make_shared<VideoSaver>(
+ 921 wrapperStructOutput.
writeVideo, CV_FOURCC(
'M',
'J',
'P',
'G'), originalVideoFps, finalOutputSize
+
+
+
+
+ 926 if (!writeHeatMapsCleaned.empty())
- 928 const auto guiInfoAdder = std::make_shared<GuiInfoAdder>(gpuNumber, wrapperStructOutput.
displayGui);
-
-
-
-
-
-
-
- 936 std::vector<std::shared_ptr<Renderer>> renderers;
-
- 938 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseCpuRenderer));
-
- 940 for (
const auto& poseGpuRenderer : poseGpuRenderers)
- 941 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseGpuRenderer));
-
- 943 const auto gui = std::make_shared<Gui>(
- 944 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
- 945 spVideoSeek, poseExtractors, renderers
-
-
- 948 spWGui = {std::make_shared<WGui<TDatumsPtr>>(gui)};
-
-
-
-
-
- 954 catch (
const std::exception& e)
-
- 956 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 960 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 965 configureThreadManager();
-
- 967 mThreadManager.exec();
+ 928 const auto heatMapSaver = std::make_shared<HeatMapSaver>(writeHeatMapsCleaned,
+
+
+
+
+
+
+
+
+
+
+ 939 const auto guiInfoAdder = std::make_shared<GuiInfoAdder>(numberThreads, wrapperStructOutput.
displayGui);
+
+
+
+
+
+
+
+ 947 std::vector<std::shared_ptr<Renderer>> renderers;
+
+ 949 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseCpuRenderer));
+
+ 951 for (
const auto& poseGpuRenderer : poseGpuRenderers)
+ 952 renderers.emplace_back(std::static_pointer_cast<Renderer>(poseGpuRenderer));
+
+ 954 const auto gui = std::make_shared<Gui>(
+ 955 finalOutputSize, wrapperStructOutput.
fullScreen, mThreadManager.getIsRunningSharedPtr(),
+ 956 spVideoSeek, poseExtractors, renderers
+
+
+ 959 spWGui = {std::make_shared<WGui<TDatumsPtr>>(gui)};
+
+
+
+
+
+ 965 catch (
const std::exception& e)
+
+ 967 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
- 969 catch (
const std::exception& e)
-
- 971 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 975 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 980 configureThreadManager();
-
- 982 mThreadManager.start();
+
+
+ 971 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 976 configureThreadManager();
+
+ 978 mThreadManager.exec();
+
+ 980 catch (
const std::exception& e)
+
+ 982 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
- 984 catch (
const std::exception& e)
-
- 986 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 990 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 995 mThreadManager.stop();
-
- 997 catch (
const std::exception& e)
-
- 999 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 1003 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1008 return mThreadManager.isRunning();
-
- 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.tryEmplace(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(
"Emplace cannot be called if an input worker was already selected.",
- 1041 __LINE__, __FUNCTION__, __FILE__);
- 1042 return mThreadManager.waitAndEmplace(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.tryPush(tDatums);
-
- 1061 catch (
const std::exception& e)
-
- 1063 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1068 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1073 if (!mUserInputWs.empty())
- 1074 error(
"Push cannot be called if an input worker was already selected.",
- 1075 __LINE__, __FUNCTION__, __FILE__);
- 1076 return mThreadManager.waitAndPush(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.tryPop(tDatums);
-
- 1095 catch (
const std::exception& e)
-
- 1097 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1102 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1107 if (!mUserOutputWs.empty())
- 1108 error(
"Pop cannot be called if an output worker was already selected.",
- 1109 __LINE__, __FUNCTION__, __FILE__);
- 1110 return mThreadManager.waitAndPop(tDatums);
-
- 1112 catch (
const std::exception& e)
-
- 1114 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1119 template<
typename TDatums,
typename TWorker,
typename TQueue>
-
-
-
-
- 1124 mConfigured =
false;
- 1125 mThreadManager.reset();
-
-
- 1128 mUserInputWs.clear();
- 1129 wDatumProducer =
nullptr;
- 1130 spWScaleAndSizeExtractor =
nullptr;
- 1131 spWCvMatToOpInput =
nullptr;
- 1132 spWCvMatToOpOutput =
nullptr;
-
- 1134 mPostProcessingWs.clear();
- 1135 mUserPostProcessingWs.clear();
-
-
- 1138 mUserOutputWs.clear();
-
- 1140 catch (
const std::exception& e)
-
- 1142 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 1146 template<
typename TDatums,
typename TWorker,
typename TQueue>
- 1147 void Wrapper<TDatums, TWorker, TQueue>::configureThreadManager()
-
-
-
-
-
-
-
- 1155 error(
"Configure the Wrapper class before calling `start()`.", __LINE__, __FUNCTION__, __FILE__);
- 1156 if ((wDatumProducer ==
nullptr) == (mUserInputWs.empty())
-
-
-
- 1160 const auto message =
"You need to have 1 and only 1 producer selected. You can introduce your own"
- 1161 " producer by using setWorkerInput() or use the OpenPose default producer by"
- 1162 " configuring it in the configure function) or use the"
- 1163 " ThreadManagerMode::Asynchronous(In) mode.";
- 1164 error(message, __LINE__, __FUNCTION__, __FILE__);
-
- 1166 if (mOutputWs.empty() && mUserOutputWs.empty() && spWGui ==
nullptr
-
-
-
- 1170 error(
"No output selected.", __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1175 mThreadManager.reset();
-
- 1177 auto queueIn = 0ull;
- 1178 auto queueOut = 1ull;
-
- 1180 spWIdGenerator = std::make_shared<WIdGenerator<std::shared_ptr<TDatums>>>();
- 1181 if (!mUserInputWs.empty() && mUserInputWsOnNewThread)
-
-
- 1184 mThreadManager.add(mThreadId, mUserInputWs, queueIn++, queueOut++);
- 1185 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
-
-
-
- 1189 if (spWCvMatToOpOutput ==
nullptr)
- 1190 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput},
- 1191 queueIn++, queueOut++);
-
- 1193 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput,
- 1194 spWCvMatToOpOutput}, queueIn++, queueOut++);
-
-
- 1197 mThreadManager.add(mThreadId, spWIdGenerator, queueIn++, queueOut++);
-
-
-
-
- 1202 std::vector<TWorker> workersAux;
-
- 1204 if (!mUserInputWs.empty())
-
-
- 1207 else if (wDatumProducer !=
nullptr)
- 1208 workersAux =
mergeVectors(workersAux, {wDatumProducer});
-
-
-
- 1212 error(
"No input selected.", __LINE__, __FUNCTION__, __FILE__);
-
- 1214 workersAux =
mergeVectors(workersAux, {spWIdGenerator});
-
- 1216 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
- 1217 workersAux =
mergeVectors(workersAux, {spWScaleAndSizeExtractor,
- 1218 spWCvMatToOpInput});
-
- 1220 if (spWCvMatToOpOutput !=
nullptr)
- 1221 workersAux =
mergeVectors(workersAux, {spWCvMatToOpOutput});
-
- 1223 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
-
-
-
-
- 1228 if (!spWPoses.empty())
-
- 1230 if (mMultiThreadEnabled)
-
- 1232 for (
auto& wPose : spWPoses)
-
- 1234 mThreadManager.add(mThreadId, wPose, queueIn, queueOut);
-
-
-
-
-
- 1240 if (spWPoses.size() > 1)
- 1241 log(
"Multi-threading disabled, only 1 thread running. All GPUs have been disabled but the"
- 1242 " first one, which is defined by gpuNumberStart (e.g. in the OpenPose demo, it is set"
-
- 1244 mThreadManager.add(mThreadId, spWPoses.at(0), queueIn, queueOut);
-
-
-
-
-
- 1250 if (!mUserPostProcessingWs.empty() && mUserPostProcessingWsOnNewThread)
-
-
- 1253 if (!mPostProcessingWs.empty())
-
-
- 1256 mThreadManager.add(mThreadId, mPostProcessingWs, queueIn++, queueOut++);
-
-
-
-
- 1261 mThreadManager.add(mThreadId, mUserPostProcessingWs, queueIn++, queueOut++);
-
-
- 1264 if (!mOutputWs.empty())
+
+
+ 986 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 991 configureThreadManager();
+
+ 993 mThreadManager.start();
+
+ 995 catch (
const std::exception& e)
+
+ 997 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 1001 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1006 mThreadManager.stop();
+
+ 1008 catch (
const std::exception& e)
+
+ 1010 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 1014 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1019 return mThreadManager.isRunning();
+
+ 1021 catch (
const std::exception& e)
+
+ 1023 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1028 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1033 if (!mUserInputWs.empty())
+ 1034 error(
"Emplace cannot be called if an input worker was already selected.",
+ 1035 __LINE__, __FUNCTION__, __FILE__);
+ 1036 return mThreadManager.tryEmplace(tDatums);
+
+ 1038 catch (
const std::exception& e)
+
+ 1040 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1045 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1050 if (!mUserInputWs.empty())
+ 1051 error(
"Emplace cannot be called if an input worker was already selected.",
+ 1052 __LINE__, __FUNCTION__, __FILE__);
+ 1053 return mThreadManager.waitAndEmplace(tDatums);
+
+ 1055 catch (
const std::exception& e)
+
+ 1057 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1062 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1067 if (!mUserInputWs.empty())
+ 1068 error(
"Push cannot be called if an input worker was already selected.",
+ 1069 __LINE__, __FUNCTION__, __FILE__);
+ 1070 return mThreadManager.tryPush(tDatums);
+
+ 1072 catch (
const std::exception& e)
+
+ 1074 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1079 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1084 if (!mUserInputWs.empty())
+ 1085 error(
"Push cannot be called if an input worker was already selected.",
+ 1086 __LINE__, __FUNCTION__, __FILE__);
+ 1087 return mThreadManager.waitAndPush(tDatums);
+
+ 1089 catch (
const std::exception& e)
+
+ 1091 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1096 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1101 if (!mUserOutputWs.empty())
+ 1102 error(
"Pop cannot be called if an output worker was already selected.",
+ 1103 __LINE__, __FUNCTION__, __FILE__);
+ 1104 return mThreadManager.tryPop(tDatums);
+
+ 1106 catch (
const std::exception& e)
+
+ 1108 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1113 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1118 if (!mUserOutputWs.empty())
+ 1119 error(
"Pop cannot be called if an output worker was already selected.",
+ 1120 __LINE__, __FUNCTION__, __FILE__);
+ 1121 return mThreadManager.waitAndPop(tDatums);
+
+ 1123 catch (
const std::exception& e)
+
+ 1125 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1130 template<
typename TDatums,
typename TWorker,
typename TQueue>
+
+
+
+
+ 1135 mConfigured =
false;
+ 1136 mThreadManager.reset();
+
+
+ 1139 mUserInputWs.clear();
+ 1140 wDatumProducer =
nullptr;
+ 1141 spWScaleAndSizeExtractor =
nullptr;
+ 1142 spWCvMatToOpInput =
nullptr;
+ 1143 spWCvMatToOpOutput =
nullptr;
+
+ 1145 mPostProcessingWs.clear();
+ 1146 mUserPostProcessingWs.clear();
+
+
+ 1149 mUserOutputWs.clear();
+
+ 1151 catch (
const std::exception& e)
+
+ 1153 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+ 1157 template<
typename TDatums,
typename TWorker,
typename TQueue>
+ 1158 void Wrapper<TDatums, TWorker, TQueue>::configureThreadManager()
+
+
+
+
+
+
+
+ 1166 error(
"Configure the Wrapper class before calling `start()`.", __LINE__, __FUNCTION__, __FILE__);
+ 1167 if ((wDatumProducer ==
nullptr) == (mUserInputWs.empty())
+
+
+
+ 1171 const auto message =
"You need to have 1 and only 1 producer selected. You can introduce your own"
+ 1172 " producer by using setWorkerInput() or use the OpenPose default producer by"
+ 1173 " configuring it in the configure function) or use the"
+ 1174 " ThreadManagerMode::Asynchronous(In) mode.";
+ 1175 error(message, __LINE__, __FUNCTION__, __FILE__);
+
+ 1177 if (mOutputWs.empty() && mUserOutputWs.empty() && spWGui ==
nullptr
+
+
+
+ 1181 error(
"No output selected.", __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1186 mThreadManager.reset();
+
+ 1188 auto queueIn = 0ull;
+ 1189 auto queueOut = 1ull;
+
+ 1191 spWIdGenerator = std::make_shared<WIdGenerator<std::shared_ptr<TDatums>>>();
+ 1192 if (!mUserInputWs.empty() && mUserInputWsOnNewThread)
+
+
+ 1195 mThreadManager.add(mThreadId, mUserInputWs, queueIn++, queueOut++);
+ 1196 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
+
+
+
+ 1200 if (spWCvMatToOpOutput ==
nullptr)
+ 1201 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput},
+ 1202 queueIn++, queueOut++);
+
+ 1204 mThreadManager.add(mThreadId, {spWIdGenerator, spWScaleAndSizeExtractor, spWCvMatToOpInput,
+ 1205 spWCvMatToOpOutput}, queueIn++, queueOut++);
+
+
+ 1208 mThreadManager.add(mThreadId, spWIdGenerator, queueIn++, queueOut++);
+
+
+
+
+ 1213 std::vector<TWorker> workersAux;
+
+ 1215 if (!mUserInputWs.empty())
+
+
+ 1218 else if (wDatumProducer !=
nullptr)
+ 1219 workersAux =
mergeVectors(workersAux, {wDatumProducer});
+
+
+
+ 1223 error(
"No input selected.", __LINE__, __FUNCTION__, __FILE__);
+
+ 1225 workersAux =
mergeVectors(workersAux, {spWIdGenerator});
+
+ 1227 if (spWScaleAndSizeExtractor !=
nullptr && spWCvMatToOpInput !=
nullptr)
+ 1228 workersAux =
mergeVectors(workersAux, {spWScaleAndSizeExtractor,
+ 1229 spWCvMatToOpInput});
+
+ 1231 if (spWCvMatToOpOutput !=
nullptr)
+ 1232 workersAux =
mergeVectors(workersAux, {spWCvMatToOpOutput});
+
+ 1234 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
+
+
+
+
+ 1239 if (!spWPoses.empty())
+
+ 1241 if (mMultiThreadEnabled)
+
+ 1243 for (
auto& wPose : spWPoses)
+
+ 1245 mThreadManager.add(mThreadId, wPose, queueIn, queueOut);
+
+
+
+
+
+ 1251 if (spWPoses.size() > 1)
+ 1252 log(
"Multi-threading disabled, only 1 thread running. All GPUs have been disabled but the"
+ 1253 " first one, which is defined by gpuNumberStart (e.g. in the OpenPose demo, it is set"
+
+ 1255 mThreadManager.add(mThreadId, spWPoses.at(0), queueIn, queueOut);
+
+
+
+
+
+ 1261 if (!mUserPostProcessingWs.empty() && mUserPostProcessingWsOnNewThread)
+
+
+ 1264 if (!mPostProcessingWs.empty())
-
- 1267 mThreadManager.add(mThreadId, mOutputWs, queueIn++, queueOut++);
+
+ 1267 mThreadManager.add(mThreadId, mPostProcessingWs, queueIn++, queueOut++);
-
-
-
-
-
- 1275 auto workersAux =
mergeVectors(mPostProcessingWs, mUserPostProcessingWs);
-
- 1277 if (!workersAux.empty())
-
-
- 1280 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
-
-
-
-
-
- 1286 if (!mUserOutputWs.empty())
-
- 1288 if (mUserOutputWsOnNewThread)
+
+
+ 1272 mThreadManager.add(mThreadId, mUserPostProcessingWs, queueIn++, queueOut++);
+
+
+ 1275 if (!mOutputWs.empty())
+
+
+ 1278 mThreadManager.add(mThreadId, mOutputWs, queueIn++, queueOut++);
+
+
+
+
+
+
+
+ 1286 auto workersAux =
mergeVectors(mPostProcessingWs, mUserPostProcessingWs);
+
+ 1288 if (!workersAux.empty())
- 1290 mThreadManager.add(mThreadId, mUserOutputWs, queueIn++, queueOut++);
-
-
-
- 1294 mThreadManager.add(mThreadId-1, mUserOutputWs, queueIn++, queueOut++);
-
-
- 1297 if (spWGui !=
nullptr)
+
+ 1291 mThreadManager.add(mThreadId, workersAux, queueIn++, queueOut++);
+
+
+
+
+
+ 1297 if (!mUserOutputWs.empty())
-
- 1300 mThreadManager.add(mThreadId, spWGui, queueIn++, queueOut++);
-
-
-
-
- 1305 catch (
const std::exception& e)
-
- 1307 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
- 1311 template<
typename TDatums,
typename TWorker,
typename TQueue>
- 1312 unsigned long long Wrapper<TDatums, TWorker, TQueue>::threadIdPP()
-
-
-
- 1316 if (mMultiThreadEnabled)
-
-
+ 1299 if (mUserOutputWsOnNewThread)
+
+ 1301 mThreadManager.add(mThreadId, mUserOutputWs, queueIn++, queueOut++);
+
+
+
+ 1305 mThreadManager.add(mThreadId-1, mUserOutputWs, queueIn++, queueOut++);
+
+
+ 1308 if (spWGui !=
nullptr)
+
+
+ 1311 mThreadManager.add(mThreadId, spWGui, queueIn++, queueOut++);
+
+
+
+
+ 1316 catch (
const std::exception& e)
+
+ 1318 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
- 1320 catch (
const std::exception& e)
-
- 1322 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
-
-
-
-
- 1327 extern template class Wrapper<DATUM_BASE_NO_PTR>;
-
-
- 1330 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
+
+
+ 1322 template<
typename TDatums,
typename TWorker,
typename TQueue>
+ 1323 unsigned long long Wrapper<TDatums, TWorker, TQueue>::threadIdPP()
+
+
+
+ 1327 if (mMultiThreadEnabled)
+
+
+
+ 1331 catch (
const std::exception& e)
+
+ 1333 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
+
+
+
+
+ 1338 extern template class Wrapper<DATUM_BASE_NO_PTR>;
+
+
+ 1341 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
PoseModel poseModel
Definition: wrapperStructPose.hpp:87
Point< int > netInputSize
Definition: wrapperStructPose.hpp:30
@@ -1322,17 +1333,17 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
bool addPartCandidates
Definition: wrapperStructPose.hpp:140
Definition: wPoseSaver.hpp:12
bool identification
Definition: wrapperStructPose.hpp:162
-bool tryPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1052
+bool tryPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1063
Definition: wrapperStructPose.hpp:16
std::string writeKeypoint
Definition: wrapperStructOutput.hpp:37
float alphaKeypoint
Definition: wrapperStructFace.hpp:39
Definition: wFaceSaver.hpp:12
-void stop()
Definition: wrapper.hpp:991
+void stop()
Definition: wrapper.hpp:1002
float alphaKeypoint
Definition: wrapperStructHand.hpp:59
-bool tryPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1086
-void exec()
Definition: wrapper.hpp:961
+bool tryPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1097
+void exec()
Definition: wrapper.hpp:972
@@ -1365,9 +1376,9 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
float scaleGap
Definition: wrapperStructPose.hpp:74
RenderMode renderMode
Definition: wrapperStructPose.hpp:80
-bool waitAndEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1035
+bool waitAndEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1046
Definition: wrapper.hpp:32
-bool tryEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1018
+bool tryEmplace(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1029
float scaleRange
Definition: wrapperStructHand.hpp:40
int gpuNumberStart
Definition: wrapperStructPose.hpp:59
RenderMode renderMode
Definition: wrapperStructFace.hpp:33
@@ -1378,8 +1389,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:1069
-void start()
Definition: wrapper.hpp:976
+bool waitAndPush(const std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1080
+void start()
Definition: wrapper.hpp:987
OP_API std::string formatAsDirectory(const std::string &directoryPathString)
@@ -1395,7 +1406,7 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
Definition: wFaceRenderer.hpp:11
-bool waitAndPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1103
+bool waitAndPop(std::shared_ptr< TDatums > &tDatums)
Definition: wrapper.hpp:1114
Definition: threadManager.hpp:16
Definition: wPoseRenderer.hpp:11
@@ -1431,7 +1442,7 @@ $(document).ready(function(){initNavTree('wrapper_8hpp_source.html','');});
ScaleMode keypointScale
Definition: wrapperStructPose.hpp:46
ThreadManagerMode
Definition: enumClasses.hpp:9
int gpuNumber
Definition: wrapperStructPose.hpp:53
-bool isRunning() const
Definition: wrapper.hpp:1004
+bool isRunning() const
Definition: wrapper.hpp:1015
void setWorkerInput(const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:323
float renderThreshold
Definition: wrapperStructFace.hpp:52