Example #1
0
 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__);
     }
 }
Example #2
0
    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__);
        }
    }