【发布时间】:2020-06-07 09:26:16
【问题描述】:
我想显示 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 负载。
我怎样才能使这段代码更快或更好或以其他方式解决任务(我不绑定到 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);
}
}
【问题讨论】:
-
您是在编译代码时启用优化(也称为“发布版本”)还是在测试未优化的版本?
-
Here 是
cv::getBuildInformation()对opencv本身的完整输出。对于这段代码,除了-O3,我没有指定任何内容。 -
在没有激活 putText 的情况下使用多少 cpu?你用的是什么机器?将 cv::waitKey 增加到 5、10 还是 20 会更好吗?
-
@Micka 这是一个 i3-8100T,所以它有一个 Intel UHD 630,调整 FHD 图像的大小应该不是问题。我现在用 OpenGL 支持编译它(Debian 版本没有),
cv::WINDOW_OPENGL甚至比cv::WINDOW_AUTOSIZE更快(55% CPU 与 65%)但不能与cv::WINDOW_KEEPRATIO一起工作,所以它压缩了图像。将 16:9 的视频安装到 16:10 的屏幕是可以接受的 atm,但我有另一个 4:3 比例的流看起来很尴尬。 -
@Micka
cv::WINDOW_AUTOSIZEdisables resizing completely(“大小受显示的图像限制”)而cv::WINDOW_OPENGL将完整的渲染(调整大小)卸载到 GPU。我不知道调整大小对 CPU 来说是一项艰巨的任务(就像cv::WINDOW_NORMAL所做的那样)。我在下面相应地调整了我的答案。
标签: c++ opencv video-processing video-capture preview