Как исправить сбой программы GC emgucv - PullRequest
0 голосов
/ 25 января 2019

Этот код дает сбой в режиме отладки visualstudio 2015 с emgucv 2.4.9, исключений или ошибок нет, программа просто останавливается.

Я думаю, что это связано со сборкой мусора и библиотеками opencv, написанными на C.

   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.

Спасибо

...