1

我正在尝试使用 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);
        };
4

1 回答 1

0

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

于 2011-01-07T19:27:52.750 回答