C ++,OpenCV,& Kinect:处理速度下降

时间:2017-07-28 02:37:21

标签: c++ opencv kinect

我使用C ++(Visual Studio 2015)和OpenCV(版本3.2.0)来处理从Kinect v1发送的数据。我的C ++程序第一次启动调试时没有问题。然而,在它停止调试并重新开始调试之后,它变得非常慢。

我怀疑程序在没有释放一些内存(即内存泄漏)的情况下关闭。我知道如果我使用delete函数,我需要使用new函数来释放内存。但我没有在C ++程序中使用new函数(我既没有使用malloc()函数,也相当于C程序中的new函数。)

对于OpenCV,我在程序结束时使用destroyAllWindows函数。对于Kinect v1,我还在程序结束时使用NuiShutdown()Release()CloseHandle()函数。

我还需要做些什么才能释放内存(例如,在OpenCV中释放与Mat相关的内存)?或者是其他导致处理速度降低的原因?

我很感激你的帮助。感谢。

1 个答案:

答案 0 :(得分:0)

首次运行后断开 Kinect ,然后重新连接并尝试第二次运行。

如果现在一切顺利,那么问题很可能就是问题。设备访问通常由单独的线程处理,尤其是 USB ,它们可能会卡住(如果在访问表单主机和设备端期望之间出现错误或同步问题),直到您断开设备(不确定哪个)您正在使用 Kinect 驱动程序,但 JUNGO 版本NuiShutdown()推断出此问题)。如果在首次运行后没有留下一些卡住的进程,也可以在断开连接之前检查任务管理器。

要解决此问题,您需要了解在访问期间您做错了什么。它可能是:

  1. 错误的USB端口

    使用背面而不是前插槽。

  2. 无效的USB转移请求

    设备始终在等待特定的命令集或流并等待,直到它没有收到它,因此它会阻止所有其他事情。因此,使用不受支持的命令或在错误的时间或大小的数据包中读取都会导致此问题。

  3. USB通讯不同步

    如果在处理关键操作时没有足够的 CPU 电源(或者在后台打开了太多应用程序),PC主机可能会超时。

    这也可能是由错误的gfx驱动程序引起的,因为我怀疑你正在使用渲染... 英特尔高清显卡可以轻松地产生这样的问题,特别是在笔记本电脑上。尝试禁用应用中的任何渲染,或者至少将渲染限制为 OpenGL 1.0 ,以查看两次运行之间的速度是否相同。如果是这种情况,整个桌面通常会闪烁或者没有重新绘制应用程序的一部分......动画有时会很迟钝。

    另一个问题可能是调试器。如果没有它一切都很好,那么调试器是问题,你无法解决它。访问 IO 时进行调试可能会导致同步和超时问题,尤其是 USB

  4. 要检查内存泄漏,你可以简单地看一下你在第一次运行之前获得了多少可用内存,并将它与第一,第二,第三之后的值进行比较..如果值降低,你会在某处停留某些东西。应用关闭后,属于应用程序的所有内存都被操作系统释放,所以即使你忘记了一些无关紧要的delete,除非某些线程仍在运行...

    基于 libUSB 的一些 USB 驱动程序我遇到了Handle泄漏问题。但是行为有所不同......所有都运行正常,直到没有自由句柄。在操作系统不起作用之后,您无法打开任何窗口,应用程序,任何内容......直到任何应用程序关闭。

    [Edit1]正面USB插槽

    前插槽通常连接到主板,电缆相对较长(通常是扁平的,屏蔽不太好),因此更容易受到噪音的影响。此外,由于它通常位于 HDD 周围,并且位于主板的高频部分之上,因此它还会将其引入 USB 源。所有这些都会降低 USB 信号的质量,从而导致更高的拒绝率,从而降低同步能力以及整体可用带宽。

    如果将其与背面 USB 端口进行比较,则它们没有电缆,但直接连接在 PCB 中,屏蔽路径短且屏蔽良好,因此连接质量要好得多。

    因此,如果您使用要求高带宽或同步的设备,那么前端口是一个糟糕的选择。

相关问题