Parallel.ForEach循环中的AccessViolationExeption

时间:2011-01-07 16:45:53

标签: .net parallel-processing emgucv

我正在尝试使用EmguCV在.NET中执行此代码:

Parallel.ForEach<Bitmap>(GetImagesFromCamera(), bmp =>
{
    Image<Gray, Byte> src = new Image<Gray, Byte>(bmp);
    Image<Gray, Byte> dest = new Image<Gray, Byte>(src.Width, src.Height);
    CvInvoke.cvThreshold(src, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
    form.setImage(dest);
});

这是我的GetPicturesFromCamera()方法:

static IEnumerable<Bitmap> GetImagesFromCamera()
{
    Camera cam = new Camera();
    cam.StartCapture();
    while (true)
    {
        yield return new Image<Gray, Byte>(cam.getBitmap());// <=== AccessViolationException
    }
}

在标记点,我总是得到一个AccessViolationException,说“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”, 但我没有发现错误。

你能搞清楚吗?

编辑:

我也尝试了顺序,这种方式有效:

foreach (var bmp in GetImagesFromCamera())
        {
            Image<Gray, Byte> dest = new Image<Gray, Byte>(bmp.Width, bmp.Height);
            CvInvoke.cvThreshold(bmp, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
            form.setImage(dest);
        };

但这样做不会:

foreach (var bmp in GetImagesFromCamera())
        {
            Image<Gray, Byte> dest = new Image<Gray, Byte>(bmp.Width, bmp.Height);
            Image<Gray, Byte> tmp = new Image<Gray, Byte>(bmp.Width, bmp.Height);
            CvInvoke.cvThreshold(bmp, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
            CvInvoke.cvErode(dest, tmp, IntPtr.Zero, 2);
            CvInvoke.cvDilate(tmp, dest, IntPtr.Zero, 2);
            form.setImage(dest);
        };

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案:我必须将Camera类中的所有代码放入GetImagesFromCamera方法中,但我不知道为什么。