gpt4 book ai didi

c++ - FHD视频流上OpenCV文本叠加的CPU占用空间太高

转载 作者:行者123 更新时间:2023-12-02 09:53:37 26 4
gpt4 key购买 nike

我想显示FHD实时流(25 fps)并覆盖一些(不断变化的)文本。为此,我基本上使用下面的代码。

基本上是

  • 加载框架
  • (此处跳过cv::putText)
  • 如果是delay的倍数,则显示框架

  • 但与例如 mpv并消耗大量CPU时间( cv::useOptimized() == true)。

    到目前为止, delay是我不方便使用的提琴参数,以某种方式使其可行。
  • delay == 1导致 180%CPU使用率(全帧速率)
  • delay == 5导致80%的CPU使用率

  • 但是 delay == 5或5 fps确实很慢,实际上cpu负载仍然太大。

    How can I make this code faster or otherwise better or otherwise solve the task (I'm not bound to opencv)?



    P.s. 不使用 cv::imshow,无论 delay为何,CPU使用率均低于30%。

    #include <opencv2/opencv.hpp>
    #include <X11/Xlib.h>

    // process ever delayth frame
    #define delay 5

    Display* disp = XOpenDisplay(NULL);
    Screen* scrn = DefaultScreenOfDisplay(disp);
    int screen_height = scrn->height;
    int screen_width = scrn->width;

    int main(int argc, char** argv){

    cv::VideoCapture cap("rtsp://url");
    cv::Mat frame;

    if (cap.isOpened())
    cap.read(frame);

    cv::namedWindow( "PREVIEW", cv::WINDOW_NORMAL );
    cv::resizeWindow( "PREVIEW", screen_width, screen_height );

    int framecounter = 0;
    while (true){

    if (cap.isOpened()){

    cap.read(frame);
    framecounter += 1;

    // Display only delay'th frame
    if (framecounter % delay == 0){
    /*
    * cv::putText
    */
    framecounter = 0;
    cv::imshow("PREVIEW", frame);
    }

    }
    cv::waitKey(1);
    }
    }

    最佳答案

    现在,我发现了有关 valgrind (存储库)和 gprof2dot (pip3 install --user gprof2dot)的信息:

    valgrind --tool=callgrind /path/to/my/binary    # Produced file callgrind.out.157532
    gprof2dot --format=callgrind --output=out.dot callgrind.out.157532
    dot -Tpdf out.dot -o graph.pdf

    那产生了一个奇妙的图形,说超过60%的 cvResize上蒸发了
    确实,当我注释掉 cv::resizeWindow时,CPU使用率从180%降低到〜60%。

    由于屏幕的分辨率为1920 x 1200,流的分辨率为1920 x 1080,因此除了燃烧CPU周期外,它实际上什么也没做。

    到目前为止,这仍然很脆弱。一旦将其切换到全屏模式并返回,CPU负载就会恢复到180%。

    为了解决这个问题,事实证明,我可以完全禁用 cv::WINDOW_AUTOSIZE的大小调整...

    cv::namedWindow( "PREVIEW", cv::WINDOW_AUTOSIZE );

    ...或-按照 Micka的建议-在使用OpenGL支持编译的OpenCV版本上( -DWITH_OPENGL=ON,不是我的Debian存储库版本),使用...

        cv::namedWindow( "PREVIEW", cv::WINDOW_OPENGL );

    ...将渲染工作卸载到GPU,与调整大小一起变得更快(CPU占55%,而我占65%)。
    cv::WINDOW_KEEPRATIO一起工作只是 does not seem。*

    此外,事实证明 cv:UMat可以用作 cv:Mat的直接替代品,从而进一步提高了性能(如 ps -e -o pcpu,args所示):



    附录

    [*]因此,我们必须手动缩放比例并注意宽高比。
    float screen_aspratio = (float) screen_width / screen_height;
    float image_aspratio = (float) image_width / image_height;

    if ( image_aspratio >= screen_aspratio ) { // width limited, center window vertically
    cv::resizeWindow("PREVIEW", screen_width, screen_width / image_aspratio );
    cv::moveWindow( "PREVIEW", 0, (screen_height - image_height) / 2 );
    }
    else { // height limited, center window horizontally
    cv::resizeWindow("PREVIEW", screen_height * image_aspratio, screen_height );
    cv::moveWindow( "PREVIEW", (screen_width - image_width) / 2, 0 );
    }

    关于c++ - FHD视频流上OpenCV文本叠加的CPU占用空间太高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62243373/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com