我在QtGui-Application中使用了自定义的OpenCV VideoProcessor-Class。我的MainWindow有2个ViewerWidgets,用于显示VideoProcessor对象产生的输入帧和输出帧。VideoProcessor-Object在这些ViewerWidget上获取指针,以在这些Widget上显示已处理的帧。

启动应用程序时,GUI窗口中的所有内容都会响应用户输入。但是,当我开始处理时,它停止响应。我什至无法关闭窗口或从“应用程序菜单”中选择某些内容。该处理将显示正确的输出并继续运行,但是Window不再响应。

这是开始处理的MainWindow插槽: 通用标签

这是VideoProcessor。该文件来自OpenCV Cookbook,我对其进行了更改,使其在以下代码末尾的run()函数中获取指向ViewerWidgets的指针。 通用标签

有帮助吗?

解决方案

尽管我无法找出问题的具体原因是什么,但我终于找到了对我有用的解决方案:

正如您所建议的,我摆脱了这个VideoProcessor-Utility类,并通过使用QTimer在每个帧之间进行延迟,实现了用于处理MainWindow内部帧序列的Processing-Loop。

我制作了“ ProcessorWidget”而不是VideoProcessor-Class。该GUI窗口小部件提供了所有输入控件,用于参数化我到目前为止已实现的每个处理器功能。

所有OpenCV代码现在都在ProcessorWidget类中,并且具有一个公共插槽cv :: Mat进程(cv :: Mat输入),该过程仅接收输入帧,然后从GUI并在内部处理正确处理器和参数的选择。

MainWindow现在构造了ViewerWidgets和ProcessorWidget,并拥有Control和Timing。

处理和显示框架现在只是: 通用标签

如果我想添加更多的OpenCV功能,则不必更改MainWindow或GUI。所有这些都在ProcessorWidget-Class中完成。

其他提示

openCV的highgui窗口处理它自己的事件循环-您不能(轻松地)将其与QMainWindows事件循环混合。

简单的方法是在openCV中获取图像并使用Qimage和QPainter在Qt中显示-QImage的24位RGB888格式与opencv的CV_8UC3兼容

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top