如何修复GC崩溃的emgucv程序

时间:2019-01-25 15:03:46

标签: c# garbage-collection emgucv

此代码在带有emgucv 2.4.9的调试模式visualstudio 2015中崩溃,没有异常或错误,程序只是停止了。

我认为这与用C语言编写的垃圾回收和opencv库有关。

   public void Proc(){

GpuImage<Bgr, byte> frame1 = new GpuImage<Bgr, byte>();
        GpuImage<Bgr, byte> frame2 = new GpuImage<Bgr, byte>();
        frame1 = new GpuImage<Bgr, byte>(capVideo.QuerySmallFrame());
        frame2 = new GpuImage<Bgr, byte>(capVideo.QuerySmallFrame());
        work = true;
        while (work)
        {
            GpuMat frame1Copy = new GpuMat(frame1.Clone());
            GpuMat frame1Copy2 = new GpuMat();
            GpuMat frame2Copy = new GpuMat(frame2.Clone());
            GpuMat frame2Copy2 = new GpuMat();
            GpuMat imgDifference = new GpuMat();
            GpuMat imgThresh = new GpuMat();
            GpuInvoke.CvtColor(frame1Copy, frame1Copy2, COLOR_CONVERSION.BGR2GRAY, IntPtr.Zero);
            GpuInvoke.CvtColor(frame2Copy, frame2Copy2, COLOR_CONVERSION.BGR2GRAY, IntPtr.Zero);

            GpuInvoke.GaussianBlur(frame1Copy2, frame1Copy, new Size(5, 5), IntPtr.Zero, 0, 0, BORDER_TYPE.DEFAULT, BORDER_TYPE.DEFAULT, IntPtr.Zero);

            GpuInvoke.GaussianBlur(frame2Copy2, frame2Copy, new Size(5, 5), IntPtr.Zero, 0, 0, BORDER_TYPE.DEFAULT, BORDER_TYPE.DEFAULT, IntPtr.Zero);

            GpuInvoke.Absdiff(frame1Copy, frame2Copy, imgDifference, IntPtr.Zero);

            GpuInvoke.Threshold(imgDifference, imgThresh, 30, 255.0, THRESH.CV_THRESH_BINARY, IntPtr.Zero);


            GpuImage<Gray, byte> auxgi = new GpuImage<Gray, byte>(imgThresh);
            Image<Gray, byte> imgThreshCopy = new Image<Gray, byte>(auxgi.Bitmap); (it crashes here)

}

预期结果是它运行了x次而没有崩溃,但是它在第二次或5英尺迭代中默默崩溃,这取决于您是尝试处置某些东西还是调用GC.collect。

谢谢

0 个答案:

没有答案