#ifndef OPENPOSE_POSE_W_POSE_EXTRACTOR_HPP #define OPENPOSE_POSE_W_POSE_EXTRACTOR_HPP #include #include #include namespace op { template class WPoseExtractor : public Worker { public: explicit WPoseExtractor(const std::shared_ptr& poseExtractorSharedPtr); virtual ~WPoseExtractor(); void initializationOnThread(); void work(TDatums& tDatums); private: std::shared_ptr spPoseExtractor; DELETE_COPY(WPoseExtractor); }; } // Implementation #include namespace op { template WPoseExtractor::WPoseExtractor(const std::shared_ptr& poseExtractorSharedPtr) : spPoseExtractor{poseExtractorSharedPtr} { } template WPoseExtractor::~WPoseExtractor() { } template void WPoseExtractor::initializationOnThread() { try { spPoseExtractor->initializationOnThread(); } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); } } template void WPoseExtractor::work(TDatums& tDatums) { try { if (checkNoNullNorEmpty(tDatums)) { // Debugging log opLogIfDebug("", Priority::Low, __LINE__, __FUNCTION__, __FILE__); // Profiling speed const auto profilerKey = Profiler::timerInit(__LINE__, __FUNCTION__, __FILE__); // Extract people pose for (auto i = 0u ; i < tDatums->size() ; i++) // for (auto& tDatum : *tDatums) { auto& tDatumPtr = (*tDatums)[i]; // OpenPose net forward pass spPoseExtractor->forwardPass( tDatumPtr->inputNetData, Point{tDatumPtr->cvInputData.cols(), tDatumPtr->cvInputData.rows()}, tDatumPtr->scaleInputToNetInputs, tDatumPtr->poseNetOutput, tDatumPtr->id); // OpenPose keypoint detector tDatumPtr->poseCandidates = spPoseExtractor->getCandidatesCopy(); tDatumPtr->poseHeatMaps = spPoseExtractor->getHeatMapsCopy(); tDatumPtr->poseKeypoints = spPoseExtractor->getPoseKeypoints().clone(); tDatumPtr->poseScores = spPoseExtractor->getPoseScores().clone(); tDatumPtr->scaleNetToOutput = spPoseExtractor->getScaleNetToOutput(); // Keep desired top N people spPoseExtractor->keepTopPeople(tDatumPtr->poseKeypoints, tDatumPtr->poseScores); // ID extractor (experimental) tDatumPtr->poseIds = spPoseExtractor->extractIdsLockThread( tDatumPtr->poseKeypoints, tDatumPtr->cvInputData, i, tDatumPtr->id); // Tracking (experimental) spPoseExtractor->trackLockThread( tDatumPtr->poseKeypoints, tDatumPtr->poseIds, tDatumPtr->cvInputData, i, tDatumPtr->id); } // Profiling speed Profiler::timerEnd(profilerKey); Profiler::printAveragedTimeMsOnIterationX(profilerKey, __LINE__, __FUNCTION__, __FILE__); // Debugging log opLogIfDebug("", Priority::Low, __LINE__, __FUNCTION__, __FILE__); } } catch (const std::exception& e) { this->stop(); tDatums = nullptr; error(e.what(), __LINE__, __FUNCTION__, __FILE__); } } COMPILE_TEMPLATE_DATUM(WPoseExtractor); } #endif // OPENPOSE_POSE_W_POSE_EXTRACTOR_HPP