OpenCV文本覆盖上的CPU占用空间太高

问题描述 投票:1回答:1

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

基本上是

  1. 加载框架
  2. ([cv::putText在这里跳过)
  3. 如果是delay的倍数,则显示框架

但是代码比起例如mpv并占用大量CPU时间(cv::useOptimized() == true)。

到目前为止,delay是我在某种程度上使它变得不方便的提琴参数。

  • delay == 1导致180%CPU使用率(全帧速率)
  • [delay == 5导致80%的CPU使用率

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

如何使此代码更快或更佳,或者解决任务(我不受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){

  int image_width, image_height

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

  if (cap.isOpened()){
    cap.read(frame);
    image_width  = frame.cols;
    image_height = frame.rows;
  }

  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);
  }
}
    

我想显示FHD实时流(25 fps)并覆盖一些(变化中的)文本。为此,我基本上使用下面的代码。基本上是Load frame(在这里跳过cv :: putText)如果是...,则显示框架...] >>

弹出的一件事是,您正在创建一个新窗口,并在每次要显示内容时调整其大小。

移动这些行

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

到您的while(true)之前,然后查看它可以解决此问题

c++ opencv video-processing video-capture preview
1个回答
1
投票

弹出的一件事是,您正在创建一个新窗口,并在每次要显示内容时调整其大小。

© www.soinside.com 2019 - 2024. All rights reserved.