Hallo Community,
ich bin noch ein C#-Neuling und habe ein Problem. Ichwürde gerne zwei Bilder miteinander vergleichen (das eine ist soll das erste Bild von der Webcam sein und das ander das aktuelle) und diese Pixel für Pixel durchgehen. Ansich ja kein Problem. Wenn ich das Programm jetzt aber starten möchte, gibt mit VS aus:
Fehlermeldung:
Das Objekt wird bereits an einer anderen Stelle verwendet.
//Soll die Bilder vergleichen
private void comparePictures()
{
int height = startImage.Height;
int widht = startImage.Width;
int amountOfPixels = height * widht;
int different = 0;
for (int h = 0; h < height; h++)
{
for(int w = 0; w < widht; w++)
{
if (startImage.GetPixel(w, h).ToString() != actuallImage.GetPixel(w, h).ToString())// Das Objekt wird bereits an einer anderen Stelle verwendet.
different++;
}
}
if (different > 0.1F * amountOfPixels)
differentFound();
}
Und noch wie ich die Bilder bekomme :
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
//Soll sich das erste Bild der Webcam holen
if (firstrun == true)
{
firstrun = false;
System.Threading.Thread.Sleep(5000);//Erst aber nach 5 Sekunden
startImage = (Bitmap)eventArgs.Frame.Clone();
}
videoWindow.Image = (Bitmap)eventArgs.Frame.Clone();
System.Threading.Thread p = new System.Threading.Thread(new System.Threading.ThreadStart(comparePictures));
if (!p.IsAlive)
{
actuallImage = (Bitmap)videoWindow.Image.Clone();
p.Start();
}
}
Hallo Madome31,
du erstellt bei jedem Eintritt des Events einen neuen Thread der deine Bilder vergleicht. Ungünstigerweise synchronisierst du den Zugriff auf "actuallImage" aber nicht, so dass deine Fehlermeldung durch eine Race condition entstehen sollte.
Ich empfehle dir den Zugriff auf actualImage durch lock abzuriegeln.
Zudem würde ich dir empfehlen, das ständige anlegen von Threadobjekten zu überdenken und den Sleep im Event-Handler zu entfernen. Das Event wird ja wahrscheinlich nur dann geworfen wenn tatsächlich auch ein Bild in den EventArgs vorliegt.
Gruß Chris