Этот код дает сбой в режиме отладки 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.
Спасибо