Das Objekt wird bereits an anderer Stelle verwendet - Exception



  • Guten Tag,

    ich versuche mich gerade einbisschen in Sachen Objekterkennung.
    Mir ist klar, dass meine Form-Anwendung nicht die beste Lösung ist - für mich reicht es aber.

    Das Problem tritt in dieser Methode auf:

    private Image findeBereich(PictureBox pb)
            {
                    Image img = pb.Image;
                    FastBitmap fb = new FastBitmap(new Bitmap(img)); // HIER!!!
                    Color schwelle = Color.FromArgb(255, 128, 128, 128);
                    Color aColor;
                    int minX = fb.Width, minY = fb.Height, maxX = 0, maxY = 0;
                    for (int y = 0; y < fb.Height; y++)
                    {
                        for (int x = 0; x < fb.Width; x++)
                        {
                            aColor = fb.GetPixel(x, y);
                            if (aColor.R <= schwelle.R && aColor.G <= schwelle.G && aColor.B <= schwelle.B)
                            {
                                if (minX > x) { minX = x; }
                                if (maxX < x) { maxX = x; }
                                if (minY > y) { minY = y; }
                                if (maxY < y) { maxY = y; }
                            }
                        }
                    }
    
                    // Bitmap Erstellen und Laden
                    Bitmap temp = new Bitmap(img);
                    Graphics g = Graphics.FromImage(temp);
    
                    // zeichnen
                    Pen pen = new Pen(Color.Red);
                    pen.Width = 2.0f;
                    g.DrawRectangle(pen, minX, minY, maxX - minX, maxY - minY);
    
                    //Graphics speichern und dann disposen
                    g.Save();
                    g.Dispose();
    
                    fb = null;
                    //Bitmap wieder in PictureBox reinladen:
                    return temp;
            }
    

    Ich deklariere doch immer wieder das Objekt neu, daher weiß ich nicht genau, warum der Fehler auftritt. Hat hier jemand eine Idee?

    Aufgerufen wird die Methode hier:

    void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
            {
                //Jedes ankommende Objekt als Bitmap casten und der Picturebox zuweisen
                //(Denkt an das ".Clone()", um Zugriffsverletzungen aus dem Weg zu gehen.)
                pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
                pictureBox1.Image = this.findeBereich(pictureBox1);
            }
    

    Der Konstruktor der Klasse, welcher diese Probleme macht:

    public FastBitmap(Bitmap bild)
            {
                Bild = bild;
                //new Thread(new ThreadStart(SetUp)).Start();
                SetUp();
            }
    

    Ich habe mal das Thread auskommentiert, da ich erstmal dachte, es liegt vielleicht daran.
    Die Klasse FastBitmap ist einfach eine "verbesserte" Version von Bitmap. Die soll deutlich schneller sein als das ganze GetPixel().
    Ich stehe gerade voll auf dem Schlauch und habe keine Idee in welche Richtung die Problembehebung gehen soll.

    Habt ihr vielleicht Rat?

    mfg Klars Sechter.



  • Versuch mal folgendes:
    Image img = pb.Image;
    pb.Image = null;

    Bzw auf die Übergabe der PBox verzichten und erst das Ergebnis drauflegen.

    Evtl. kommt es irgendwo zu zwei Bitmap.LockBits aufrufen, was diesen Fehler verursachen kann.


Anmelden zum Antworten