AccessViolationExeption в цикле Parallel.ForEach - PullRequest
1 голос
/ 07 января 2011

Я пытаюсь выполнить этот код в .NET, используя EmguCV:

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 голосов
/ 07 января 2011

Я нашел решение: мне пришлось поместить весь код класса Camera в метод GetImagesFromCamera, но я не знаю почему.

...