【问题标题】:Drawing a videostream using wxWidgets使用 wxWidgets 绘制视频流
【发布时间】:2016-06-17 03:35:33
【问题描述】:

我有一个相对简单的应用程序,它目前利用 OpenCV 使用 cv::VideoCapture 从相机中获取图像,并使用在 OS X El Capitan 上运行的 imshow() 在窗口中查看生成的图像。

在这期间我正在做一些基本的图像修改,但这对我的问题并不重要。

由于 OpenCV 实现的 GUI 非常基本,我决定使用 wxWidgets 重做它。我得到它的运行基本上类似于 wxWidgets 教程部分中的实现linked。 (将其更新为 C++11 等,但想法几乎相同。代码位于 github。)

现在我的问题是:在最好的情况下,我得到的帧速率只有 OpenCV 唯一解决方案的一半。 OpenCV 在下面使用 qt。但是当我查看堆栈跟踪时,它归结为使用 CoreGraphics 的类似函数调用。

所以我的问题归结为:在 OS X 上使用 wxWidgets 将图像绘制到帧速率 > 20fps 的窗口的最佳方法是什么?目前我使用的是 DrawBitmap() 函数。

额外问题:当我的 Macbook 内部 Retina 屏幕上有窗口时,帧速率会变得更糟。我应该对图片进行任何预处理/缩放以减轻 GUI 进程的负载吗?

【问题讨论】:

    标签: c++ macos opencv wxwidgets


    【解决方案1】:

    最快的可能是使用 OpenGL(虽然我不太确定在 OS X 下这不是非常友好的 OpenGL AFAIK),但我不确定瓶颈是否真的是DrawBitmap(),它可以首先是转换为wxBitmap 的代码:如果你不使用raw bitmap access,它可能会很慢。

    【讨论】:

    • 从示例中的代码中,我采用了在设置 wxBitmap 并调用 Refresh()Update() 以触发 OnPaint事件的工作线程中进行所有图像处理的方法主线程。这是正确的方法还是我应该使用wxClientDC 直接从我的工作线程中提取?
    • 不,你甚至不能从工作线程中触摸wxBitmap,更不用说绘制它了。您所能做的就是创建wxImage(这是一个非GUI 类,因此不绑定到主线程),然后将其转换为wxBitmap 并在主线程中绘制它。这只有在接收数据也很耗时时才会有所帮助。
    • 嗯,这里的“不能”是像“它在自找麻烦”还是根本不起作用?因为实际上它工作得很好。更不用说示例(从 wxWidgets 教程页面链接)实际上从工作线程设置wxBitmap(但在CCamView 的方法中,它派生自wxWindow)。我现在将其更改为使用wxImage 并在onDraw 函数中转换为wxBitmap。至少我现在摆脱了重绘之间的闪烁。但是drawBitmap 在视网膜上绘制一张全屏图片仍需要约 110 毫秒,而在普通屏幕上绘制则需要约 15 毫秒。
    • "can't" 是"不保证工作",实际上这在 Windows 下是行不通的。
    • 我刚刚使用 OpenGL 重新实现了它。我现在需要大约 12 毫秒才能在 15 英寸视网膜显示器上绘制全屏图像。在非视网膜显示器上的时间是相同的。所以我猜在视网膜 Mac 上 drawBitmap() 存在严重问题。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多