void handleWaitKey(bool& guiPaused, FrameDisplayer& frameDisplayer, std::vector<std::shared_ptr<PoseExtractor>>& poseExtractors, std::vector<std::shared_ptr<Renderer>>& renderers, std::shared_ptr<std::atomic<bool>>& isRunningSharedPtr, std::shared_ptr<std::pair<std::atomic<bool>, std::atomic<int>>>& spVideoSeek) { try { const int key = cv::waitKey(1); if (key != -1) { // Some OpenCV versions has a problem and key must be casted to char const auto castedKey = (char)std::tolower((char)key); // ------------------------- General Commands ------------------------- // // Exit program if (castedKey==27) { if (isRunningSharedPtr != nullptr) { *isRunningSharedPtr = false; guiPaused = false; } } // Help else if (castedKey=='h') showGuiHelp(); // Switch full screen - normal screen else if (castedKey=='f') frameDisplayer.switchFullScreenMode(); // ------------------------- Producer-Related ------------------------- // // Pause else if (castedKey==' ') guiPaused = !guiPaused; // Fake pause else if (castedKey=='m') { if (spVideoSeek != nullptr) spVideoSeek->first = !spVideoSeek->first; } // Seeking in video else if (castedKey=='l' || castedKey=='k') { if (spVideoSeek != nullptr) { // Normal case, +-30 frames if (!spVideoSeek->first) spVideoSeek->second += 30 * (castedKey=='l' ? -2 : 1); // Frame by frame (if forced paused) else spVideoSeek->second += (castedKey=='l' ? -1 : 1); } } // Enable/disable blending else if (castedKey=='b') { for (auto& renderer : renderers) renderer->setBlendOriginalFrame(!renderer->getBlendOriginalFrame()); } // ------------------------- OpenPose-Related ------------------------- // // Modifying thresholds else if (castedKey=='-' || castedKey=='=') for (auto& poseExtractor : poseExtractors) poseExtractor->increase(PoseProperty::NMSThreshold, 0.005f * (castedKey=='-' ? -1 : 1)); else if (castedKey=='_' || castedKey=='+') for (auto& poseExtractor : poseExtractors) poseExtractor->increase(PoseProperty::ConnectMinSubsetScore, 0.005f * (castedKey=='_' ? -1 : 1)); else if (castedKey=='[' || castedKey==']') for (auto& poseExtractor : poseExtractors) poseExtractor->increase(PoseProperty::ConnectInterThreshold, 0.005f * (castedKey=='[' ? -1 : 1)); else if (castedKey=='{' || castedKey=='}') for (auto& poseExtractor : poseExtractors) poseExtractor->increase(PoseProperty::ConnectInterMinAboveThreshold, (castedKey=='{' ? -0.1f : 0.1f)); else if (castedKey==';' || castedKey=='\'') for (auto& poseExtractor : poseExtractors) poseExtractor->increase(PoseProperty::ConnectMinSubsetCnt, (castedKey==';' ? -1 : 1)); // ------------------------- Miscellaneous ------------------------- // // Show googly eyes else if (castedKey=='g') for (auto& renderer : renderers) renderer->setShowGooglyEyes(!renderer->getShowGooglyEyes()); // ------------------------- OpenPose-Related ------------------------- // else if (castedKey==',' || castedKey=='.') { const auto increment = (castedKey=='.' ? 1 : -1); for (auto& renderer : renderers) renderer->increaseElementToRender(increment); } else { const std::string key2part = "0123456789qwertyuiopasd"; const auto newElementToRender = key2part.find(castedKey); if (newElementToRender != std::string::npos) for (auto& renderer : renderers) renderer->setElementToRender((int)newElementToRender); } } } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); } }
void handleWaitKey(bool& guiPaused, FrameDisplayer& frameDisplayer, std::vector<std::shared_ptr<PoseExtractorNet>>& poseExtractorNets, std::vector<std::shared_ptr<FaceExtractorNet>>& faceExtractorNets, std::vector<std::shared_ptr<HandExtractorNet>>& handExtractorNets, std::vector<std::shared_ptr<Renderer>>& renderers, std::shared_ptr<std::atomic<bool>>& isRunningSharedPtr, std::shared_ptr<std::pair<std::atomic<bool>, std::atomic<int>>>& videoSeekSharedPtr, DisplayMode& displayMode, DisplayMode& displayModeOriginal) { try { const int key = cv::waitKey(1); if (key != -1) { // Some OpenCV versions has a problem and key must be casted to char const auto castedKey = (char)std::tolower((char)key); // ------------------------- General Commands ------------------------- // // Exit program if (castedKey==27) { if (isRunningSharedPtr != nullptr) { *isRunningSharedPtr = false; guiPaused = false; } } // Help else if (castedKey=='h') showGuiHelp(); // Switch full screen - normal screen else if (castedKey=='f') frameDisplayer.switchFullScreenMode(); // ------------------------- Producer-Related ------------------------- // // Pause else if (castedKey==' ') guiPaused = !guiPaused; // Fake pause else if (castedKey=='m') { if (videoSeekSharedPtr != nullptr) videoSeekSharedPtr->first = !videoSeekSharedPtr->first; } // Seeking in video else if (castedKey=='l' || castedKey=='k') { if (videoSeekSharedPtr != nullptr) { // Normal case, +-30 frames if (!videoSeekSharedPtr->first) videoSeekSharedPtr->second += 30 * (castedKey=='k' ? -2 : 1); // Frame by frame (if forced paused) else videoSeekSharedPtr->second += (castedKey=='k' ? -1 : 1); } } // Enable/disable blending else if (castedKey=='b') { for (auto& renderer : renderers) renderer->setBlendOriginalFrame(!renderer->getBlendOriginalFrame()); } // ------------------------- OpenPose-Related ------------------------- // // Modifying thresholds else if (castedKey=='-' || castedKey=='=') for (auto& poseExtractorNet : poseExtractorNets) poseExtractorNet->increase(PoseProperty::NMSThreshold, 0.005f * (castedKey=='-' ? -1 : 1)); else if (castedKey=='_' || castedKey=='+') for (auto& poseExtractorNet : poseExtractorNets) poseExtractorNet->increase(PoseProperty::ConnectMinSubsetScore, 0.005f * (castedKey=='_' ? -1 : 1)); else if (castedKey=='[' || castedKey==']') for (auto& poseExtractorNet : poseExtractorNets) poseExtractorNet->increase(PoseProperty::ConnectInterThreshold, 0.005f * (castedKey=='[' ? -1 : 1)); else if (castedKey=='{' || castedKey=='}') for (auto& poseExtractorNet : poseExtractorNets) poseExtractorNet->increase(PoseProperty::ConnectInterMinAboveThreshold, (castedKey=='{' ? -0.1f : 0.1f)); else if (castedKey==';' || castedKey=='\'') for (auto& poseExtractorNet : poseExtractorNets) poseExtractorNet->increase(PoseProperty::ConnectMinSubsetCnt, (castedKey==';' ? -1 : 1)); // ------------------------- Face/hands-Related ------------------------- // // Enable/disable face else if (castedKey=='z') { for (auto& faceExtractorNet : faceExtractorNets) faceExtractorNet->setEnabled(!faceExtractorNet->getEnabled()); // Warning if not enabled if (faceExtractorNets.empty()) log("OpenPose must be run with face keypoint estimation enabled (`--face` flag).", Priority::High); } // Enable/disable hands else if (castedKey=='x') { for (auto& handExtractorNet : handExtractorNets) handExtractorNet->setEnabled(!handExtractorNet->getEnabled()); // Warning if not enabled if (handExtractorNets.empty()) log("OpenPose must be run with face keypoint estimation enabled (`--hand` flag).", Priority::High); } // Enable/disable extra rendering (3D/Adam), while keeping 2D rendering else if (castedKey=='c') { displayMode = (displayMode == displayModeOriginal ? DisplayMode::Display2D : displayModeOriginal); } // ------------------------- Miscellaneous ------------------------- // // Show googly eyes else if (castedKey=='g') for (auto& renderer : renderers) renderer->setShowGooglyEyes(!renderer->getShowGooglyEyes()); // ------------------------- OpenPose-Related ------------------------- // else if (castedKey==',' || castedKey=='.') { const auto increment = (castedKey=='.' ? 1 : -1); for (auto& renderer : renderers) renderer->increaseElementToRender(increment); } else { // Skeleton / Background / Add keypoints / Add PAFs const std::string key2part = "1234"; const auto newElementToRender = key2part.find(castedKey); if (newElementToRender != std::string::npos) { ElementToRender elementToRender; if (castedKey=='1') elementToRender = ElementToRender::Skeleton; else if (castedKey=='2') elementToRender = ElementToRender::Background; else if (castedKey=='3') elementToRender = ElementToRender::AddKeypoints; else if (castedKey=='4') elementToRender = ElementToRender::AddPAFs; else { error("Unknown ElementToRender value.", __LINE__, __FUNCTION__, __FILE__); elementToRender = ElementToRender::Skeleton; } for (auto& renderer : renderers) renderer->setElementToRender(elementToRender); } // Heatmap visualization else { // Other rendering options // const std::string key2partHeatmaps = "0123456789qwertyuiopasd"; const std::string key2partHeatmaps = "567890"; const auto newElementToRender = key2partHeatmaps.find(castedKey); if (newElementToRender != std::string::npos) for (auto& renderer : renderers) renderer->setElementToRender((int)newElementToRender+key2part.size()); } } } } catch (const std::exception& e) { error(e.what(), __LINE__, __FUNCTION__, __FILE__); } }