此代码在带有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。
谢谢