在做WPF桌面程序时候,要调用USB摄像头,因此接触了OpenCV , 遇到了各种坑,严重烧肝终于找到原因。 涉及的类包括VideoCapture , Mat.
问题1.内存泄漏
运行以下 代码片段,会发现内存持续飙升
for (int i = 0; i < 1000; i++)
{
using (Mat image = new Mat())
using (VideoCapture capture = VideoCapture.FromCamera(1))
{
capture.Read(image);
Cv2.WaitKey(1000);
capture.Release();
image.Release();
}
}
解决办法:
把代码行:
using (VideoCapture capture = VideoCapture.FromCamera(1))
改成以下(指定API格式),内存立即平稳:
using (VideoCapture capture = VideoCapture.FromCamera(1,VideoCaptureAPIs.DSHOW))
在github OpenCV的项目讨论中找到的灵感,不得不说洋人讨论问题还是比较用心和无私。
问题2.尝试读取或写入受保护的内存。这通常指示其他内存已损坏