Aforge Bitmap weiter verarbeiten



  • Vielleicht kann mir ja jemand einen Tip geben. Ich bekomme über IP_Cam_video1 den Kamera Stream, und möchte zum einen darin was zeichnen, und bei bedarf auch drehen können.

    1. Wenn ich, wie oben in Zeile 4 auskommentiert das Bild drehe, gibt es unten in Zeile 30 ne Exeption, das IP_Cam_video1 schon in Verwendung ist.
    2. Wenn ich Zeile 5 einkommentiere, und den unteren Code nach oben umschreibe, gibt es ebenfalls eine Exeption, das er nicht in die Picturebox zeichnen kann.
    3. Wenn ich Zeile 33 einrücke, wieder ne Exeption, weil schon in Verwendung durch die obere Methode
    4. Auch der Versuch IP_Cam_Video1 in der oberen Methode über einen Delegaten in eine andere Methode zu Invoken schlägt auch fehl. Auch nicht wenn ich versuche es zu Clonen. Oder hab es nicht richtig gemacht.

    Hat jemand eine Idee und kann helfen? Vielen Dank schon mal im Voraus.

    private void Stream_1_NewFrame(object sender, NewFrameEventArgs eventArgs)
            {
                IP_Cam_video1 = (Bitmap)eventArgs.Frame.Clone();
                //IP_Cam_video1.RotateFlip(RotateFlipType.Rotate90FlipNone);
                //Graphics gr = pictureBox_Video1.CreateGraphics();
    
                pictureBox_Video1.Invalidate();
             }
    
    private void PictureBox_Video1_Paint(object sender, PaintEventArgs e)
            {
                string PlayerHeim1, PlayerHeim2, PlayerGast1, PlayerGast2;
                SizeF sizeHeim1 = new SizeF();
                SizeF sizeHeim2 = new SizeF();
                SizeF sizeGast1 = new SizeF();
                SizeF sizeGast2 = new SizeF();
    
                e.Graphics.Clear(Color.Transparent);
                int korrektur_Y = 0;
                int korrektur_X = 0;
    
                if (IP_Camera_1.IsRunning && IP_Cam_video1 != null)
                {
                    if (Video1_Rotation == 1)
                    {
                        korrektur_Y = -310;
                    }
                    if (Video1_Rotation == 2)
                    {
                        korrektur_Y = -263;
                        korrektur_X = -360;
                    }
                    if (Video1_Rotation == 3)
                    {
                        korrektur_Y = 50;
                        korrektur_X = -300;
                    }
    
                    e.Graphics.DrawImage(IP_Cam_video1, Videobox1_Verschiebung.X + korrektur_X, Videobox1_Verschiebung.Y + korrektur_Y, Zoom_Video1 * 361 / 100, Zoom_Video1 * 263 / 100);
                    e.Graphics.DrawString(PlayerHeim2, f, pinsel_black, 1, 15);
    
                    //IP_Cam_video1.RotateFlip(RotateFlipType.Rotate90FlipNone);
    
                    if (Video1_Rotation == 1)
                    {
                        e.Graphics.RotateTransform(90f);
                    }
                    else if (Video1_Rotation == 2)
                    {
                        e.Graphics.RotateTransform(180f);
                    }
                    else if (Video1_Rotation == 3)
                    {
                        e.Graphics.RotateTransform(270f);
                    }
    
    }
    


  • Wie lautet die genaue Exception?

    Und wie groß sind deine Bilder?
    Lies dazu auch mal RotateFlip generates GDI error.



  • Auflösung liegt bei 1280 x 960.

    Wenn ich Zeile 5 einkommentiere lautet die Exeption

    "System.InvalidOperationException
    HResult=0x80131509
    Nachricht = Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement pictureBox_Video1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Wenn ich Zeile 33 nutze, bleibt die Exeption grade aus, gibt aber Bildfehler ab und an. Vereinzelt sind nicht alle Bilder um 90° gedreht.



  • Hab es nun lösen können.
    Das Problem lag daran, dass die Bilder schneller von der Kamera gekommen sind, bevor die Paint Methode überhaupt fertig war, denn die ist wesentlich länger als hier abgebildet. Folglich haben beide manchmal zeitgleich drauf zu gegriffen. Hab das jetzt so gelöst.

    private void Stream_1_NewFrame(object sender, NewFrameEventArgs eventArgs)
            {
                If(paint_fertig_neues_Bild_holen == true)
                {
    
                IP_Cam_video1 = (Bitmap)eventArgs.Frame.Clone();
                pictureBox_Video1.Invalidate();
    
                }
             }
    

    Danke für Dein Beitrag TH69 🙂 .



  • Sorry, daß ich gestern nicht mehr hier reingeschaut habe.
    Freut mich aber, daß du eine Lösung selber gefunden hast (auch wenn sie mich nicht ganz so überzeugt: Ist denn dann die Bildfolge nicht etwas ruckelig?).

    PS: Ich meinte eher die Exception für 1. (Zeile 4)
    Dein 2. (Zeile 5) ist sowieso nicht zu empfehlen, d.h. außerhalb vom Paint-Ereignis auf Graphics zuzugreifen.



  • Ist die gleiche Exeption auf Threadübergreifender Vorgang, da ja schon ein neues Bild geholt wird, obwohl ich in Paint noch auf IP_Cam_Video1 was zeichne. Sind 2 unterschiedliche Threads.

    Die Lösung ist nicht die beste, ich weiß. Deshalb auch hier meine Frage nach einer besseren Lösung.
    Da es aber nur ein Dart Programm ist, wo die Kameras auf die Punkte am Automat gerichtet sind,da kommt es mir nicht ganz so auf Echtzeit an, obwohl schön wenn es das wäre.
    Es hinkt zwar minimal nach, ruckelt aber nicht nennenswert.


Anmelden zum Antworten