Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bitmaps "Das Objekt wird bereits an einer anderen Stelle verwendet" Problem
Madome31
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

Bitmaps "Das Objekt wird bereits an einer anderen Stelle verwendet" Problem

beantworten | zitieren | melden

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:
Fehler
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();
            }
        }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Madome31 am .
private Nachricht | Beiträge des Benutzers
Chris360
myCSharp.de - Member



Dabei seit:
Beiträge: 40
Herkunft: DE-NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers