C++;,OpenCV&;Kinect:处理速度下降 < >我使用C++(Visual Studio 2015)和OpenCV(VE3.0)处理Kinect V1发送的数据。我的C++程序在第一次调试时没有问题。但是,在它停止调试并重新开始调试之后,它会变得非常慢

C++;,OpenCV&;Kinect:处理速度下降 < >我使用C++(Visual Studio 2015)和OpenCV(VE3.0)处理Kinect V1发送的数据。我的C++程序在第一次调试时没有问题。但是,在它停止调试并重新开始调试之后,它会变得非常慢,c++,opencv,kinect,C++,Opencv,Kinect,我怀疑程序关闭时没有释放一些内存(即内存泄漏)。我知道如果我使用new功能,我需要使用delete功能来释放内存。但我在C++程序中没有使用新< /Cuff>函数(我也没有使用 MalCube()/Cux>函数,这相当于C程序中的新< /代码>函数。 对于OpenCV,我使用程序末尾的destroyAllWindows函数。对于Kinect v1,我还使用程序末尾的NuiShutdown()、Release()、和CloseHandle()函数 我还需要做什么来释放内存(例如,释放OpenCV中

我怀疑程序关闭时没有释放一些内存(即内存泄漏)。我知道如果我使用
new
功能,我需要使用
delete
功能来释放内存。但我在C++程序中没有使用<代码>新< /Cuff>函数(我也没有使用<代码> MalCube()/Cux>函数,这相当于C程序中的<代码>新< /代码>函数。 对于OpenCV,我使用程序末尾的
destroyAllWindows
函数。对于Kinect v1,我还使用程序末尾的
NuiShutdown()
Release()
、和
CloseHandle()
函数

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


谢谢你的帮助。谢谢。

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

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

要解决此问题,您需要找出在访问过程中您做错了什么。可能是:

  • 错误的USB端口

    使用背面而不是正面插槽

  • 无效的USB传输请求

    设备总是在等待一组特定的命令或流,并一直等待,直到它没有收到它,所以它会阻止所有其他事情。因此,使用不受支持的命令或读取错误的时间或数据包大小可能会导致这种情况

  • USB通信不同步

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

    这也可能是由错误的gfx驱动程序引起的,因为我怀疑您正在使用渲染…Intel HD graphics可以轻松产生此类问题,尤其是在笔记本电脑上。请尝试禁用应用程序中的任何渲染,或至少将渲染限制为OpenGL 1.0,以查看两次运行之间的速度是否相同。如果是这种情况整个桌面通常会闪烁,或者没有重新绘制应用程序的某些部分……动画有时会很慢

    另一个问题可能是调试器。如果没有调试器一切正常,那么调试器就是问题所在,而您无法解决它。在访问IO时进行调试可能会导致同步和超时问题,尤其是使用USB

  • 要检查内存泄漏,您只需查看第一次运行前的可用内存量,并将其与第1、2、3次运行后的值进行比较。如果该值降低,则您会在某个位置卡住。在应用程序关闭后,属于应用程序的所有内存都会被操作系统释放,因此即使您忘记了一些
    删除
    ,这也无所谓ess某些线程仍在运行

    我遇到的一些基于libUSB的USB驱动程序也出现了句柄泄漏问题。但情况不同……在没有可用句柄之前,所有的驱动程序都可以正常运行。之后OS不起作用。在任何应用程序关闭之前,你都无法打开任何窗口、应用程序、任何东西

    [Edit1]前端USB插槽

    前端插槽通常用相对较长的电缆连接到主板(通常是扁平的,屏蔽不太好)因此,它更容易受到噪声的影响。此外,由于它通常位于HDD周围以及主板高频部分上方,因此它也会将其导入USB馈送。所有这些都会降低USB信号的质量,导致更大的抑制率,从而降低同步能力,并降低过同步我们将使用带宽

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


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

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

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

    要解决此问题,您需要找出在访问过程中您做错了什么。可能是:

  • 错误的USB端口

    使用背面而不是正面插槽

  • 无效的USB传输请求

    设备总是在等待一组特定的命令或流,直到它没有收到它,所以它会阻止所有其他事情。所以使用不受支持的命令或在错误的时间读取