C++、OpenCV 和 Kinect:处理速度下降
C++, OpenCV, & Kinect: Processing speed goes down
我使用 C++ (Visual Studio 2015) 和 OpenCV (ver 3.2.0) 来处理从 Kinect v1 发送的数据。我的C++程序在第一次启动调试的时候没有问题。但是,停止调试并重新开始调试后,它变得非常慢。
我怀疑程序没有释放一些内存就关闭了(即内存泄漏)。我知道如果我使用 new
函数,我需要使用 delete
函数来释放内存。但是我没有在C++程序中使用new
函数(我也没有使用malloc()
函数,相当于C程序中的new
函数)。
对于OpenCV,我在程序末尾使用了destroyAllWindows
函数。对于Kinect v1,我还在程序的最后使用了NuiShutdown()
、Release()
和CloseHandle()
函数。
我还需要做些什么来释放内存(例如,释放与 OpenCV 中的 Mat
关联的内存)?还是其他原因导致处理速度下降?
非常感谢你的帮助。谢谢。
在第一次 运行 断开连接后 Kinect 然后重新连接并尝试第二次 运行.
如果现在一切顺利,那么问题很可能是线程卡住了。设备访问通常由单独的线程处理,尤其是 USB 它们可能会卡住(如果访问表单主机和设备端发生错误或同步问题),直到您断开设备连接(不确定你使用的是哪个 Kinect 驱动程序,但是 JUNGO 版本 NuiShutdown()
推断有这个问题)。如果在第一个 运行.
之后没有留下一些卡住的进程,您还可以在断开连接之前检查任务管理器
要解决这个问题,您需要找出您在访问期间做错了什么。可能是:
USB 端口错误
使用背面而不是正面插槽。
USB 传输请求无效
设备总是在等待特定的命令集或流,并一直等到它没有收到它,所以它会阻止所有其他事情。因此,使用不受支持的命令或读取错误的时间或数据包大小可能会导致此问题。
USB 通信不同步
如果您在处理关键操作(或在后台打开了太多应用程序)时没有足够的 CPU 电量,PC 主机可能会超时。
这也可能是由错误的 gfx 驱动程序引起的,因为我怀疑您正在使用渲染... Intel 高清显卡 可以轻松产生此类问题,尤其是在笔记本电脑上。尝试在您的应用中禁用任何渲染或至少将渲染限制为 OpenGL 1.0 以查看 运行 之间的速度是否相同。如果是这种情况,整个桌面通常会闪烁或不重新绘制应用程序的某些部分......动画有时会很慢。
另一个问题可能是调试器。如果没有它一切都很好,那么调试器就是问题所在,您无法解决它。访问 IO 时进行调试可能会导致同步和超时问题,尤其是 USB.
要检查内存泄漏,您可以简单地查看在 1st 运行 之前获得了多少可用内存,并将其与 1st、2nd、3th .. 运行s 之后的值进行比较,如果该值降低你有东西卡在什么地方了。应用程序关闭后,属于应用程序的所有内存都被 OS 释放,所以即使您忘记了一些 delete
也没关系,除非某些线程仍然 [=102] =]宁...
一些 USB 驱动程序基于 libUSB 我遇到了句柄泄漏的问题。但这表现不同......所有 运行 都很好,直到没有空闲句柄。之后 OS 无法正常运行,您无法打开任何 window、应用程序、任何...直到关闭任何应用程序。
[Edit1] 前置 USB 插槽
前插槽通常使用较长的电缆连接到主板(通常是扁平的并且屏蔽不是很好)因此更容易受到噪音的影响。此外,由于它通常位于 HDD 周围和主板的高频部分上方,因此它也会将其引入 USB 馈送。所有这些都会降低 USB 信号的质量,导致更大的拒绝率,从而降低同步能力和整体可用带宽。
如果将其与背面 USB 端口进行比较,它们没有电缆,而是直接连接在 PCB 中,路径短且屏蔽良好,因此连接质量好多了。
因此,如果您使用要求高带宽或同步的设备,那么前置端口是一个糟糕的选择。
我使用 C++ (Visual Studio 2015) 和 OpenCV (ver 3.2.0) 来处理从 Kinect v1 发送的数据。我的C++程序在第一次启动调试的时候没有问题。但是,停止调试并重新开始调试后,它变得非常慢。
我怀疑程序没有释放一些内存就关闭了(即内存泄漏)。我知道如果我使用 new
函数,我需要使用 delete
函数来释放内存。但是我没有在C++程序中使用new
函数(我也没有使用malloc()
函数,相当于C程序中的new
函数)。
对于OpenCV,我在程序末尾使用了destroyAllWindows
函数。对于Kinect v1,我还在程序的最后使用了NuiShutdown()
、Release()
和CloseHandle()
函数。
我还需要做些什么来释放内存(例如,释放与 OpenCV 中的 Mat
关联的内存)?还是其他原因导致处理速度下降?
非常感谢你的帮助。谢谢。
在第一次 运行 断开连接后 Kinect 然后重新连接并尝试第二次 运行.
如果现在一切顺利,那么问题很可能是线程卡住了。设备访问通常由单独的线程处理,尤其是 USB 它们可能会卡住(如果访问表单主机和设备端发生错误或同步问题),直到您断开设备连接(不确定你使用的是哪个 Kinect 驱动程序,但是 JUNGO 版本 NuiShutdown()
推断有这个问题)。如果在第一个 运行.
要解决这个问题,您需要找出您在访问期间做错了什么。可能是:
USB 端口错误
使用背面而不是正面插槽。
USB 传输请求无效
设备总是在等待特定的命令集或流,并一直等到它没有收到它,所以它会阻止所有其他事情。因此,使用不受支持的命令或读取错误的时间或数据包大小可能会导致此问题。
USB 通信不同步
如果您在处理关键操作(或在后台打开了太多应用程序)时没有足够的 CPU 电量,PC 主机可能会超时。
这也可能是由错误的 gfx 驱动程序引起的,因为我怀疑您正在使用渲染... Intel 高清显卡 可以轻松产生此类问题,尤其是在笔记本电脑上。尝试在您的应用中禁用任何渲染或至少将渲染限制为 OpenGL 1.0 以查看 运行 之间的速度是否相同。如果是这种情况,整个桌面通常会闪烁或不重新绘制应用程序的某些部分......动画有时会很慢。
另一个问题可能是调试器。如果没有它一切都很好,那么调试器就是问题所在,您无法解决它。访问 IO 时进行调试可能会导致同步和超时问题,尤其是 USB.
要检查内存泄漏,您可以简单地查看在 1st 运行 之前获得了多少可用内存,并将其与 1st、2nd、3th .. 运行s 之后的值进行比较,如果该值降低你有东西卡在什么地方了。应用程序关闭后,属于应用程序的所有内存都被 OS 释放,所以即使您忘记了一些 delete
也没关系,除非某些线程仍然 [=102] =]宁...
一些 USB 驱动程序基于 libUSB 我遇到了句柄泄漏的问题。但这表现不同......所有 运行 都很好,直到没有空闲句柄。之后 OS 无法正常运行,您无法打开任何 window、应用程序、任何...直到关闭任何应用程序。
[Edit1] 前置 USB 插槽
前插槽通常使用较长的电缆连接到主板(通常是扁平的并且屏蔽不是很好)因此更容易受到噪音的影响。此外,由于它通常位于 HDD 周围和主板的高频部分上方,因此它也会将其引入 USB 馈送。所有这些都会降低 USB 信号的质量,导致更大的拒绝率,从而降低同步能力和整体可用带宽。
如果将其与背面 USB 端口进行比较,它们没有电缆,而是直接连接在 PCB 中,路径短且屏蔽良好,因此连接质量好多了。
因此,如果您使用要求高带宽或同步的设备,那么前置端口是一个糟糕的选择。