2011-01-07 2 views
1

Je suis en train d'exécuter ce code dans .NET en utilisant EmguCV:AccessViolationExeption en boucle Parallel.ForEach

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

Ceci est mon GetPicturesFromCamera() Méthode:

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

Au point marqué I Toujours obtenir une exception AccessViolationException disant "Tentative de lecture ou d'écriture de la mémoire protégée, c'est souvent une indication que d'autres mémoires sont corrompues.", mais je ne trouve pas l'erreur.

Pouvez-vous le comprendre?

EDIT:

Je l'ai essayé sequencialy aussi, de cette façon cela fonctionne:

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

mais cette façon, il ne fait pas:

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

Répondre

0

J'ai trouvé une solution: j'avais pour mettre tout le code dans la classe Camera dans la méthode GetImagesFromCamera, mais je ne sais pas pourquoi.

Questions connexes