2011-01-07 6 views
1

Ich versuche, diesen Code in .NET EmguCV auszuführen:AccessViolationExeption in Parallel.ForEach Schleife

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); 
}); 

Das ist mein GetPicturesFromCamera() Methode:

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

an der markierten Stelle I bekomme immer eine AccessViolationException mit dem Spruch "Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist.", , aber ich finde den Fehler nicht.

Können Sie es herausfinden?

EDIT:

ich es versucht sequencialy auch so funktioniert es:

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); 
     }; 

aber auf diese Weise es nicht:

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); 
     }; 

Antwort

0

ich eine Lösung gefunden: Ich hatte um den gesamten Code in der Camera-Klasse in die GetImagesFromCamera-Methode einzufügen, aber ich habe keine Ahnung warum.