[c#] events afhandelen -> te weinig tijd

Pagina: 1
Acties:

  • Bint
  • Registratie: Juli 2002
  • Laatst online: 30-11 17:32
Ik ben bezig met een applicatie die beelden van een webcam//avi//whatever moet verwerken. Maar ik heb nu een klein probleem:

Elke keer als ik een nieuw frame binnen krijg, wordt er een event gevuurd, en kan ik filters over mijn beelden heen gooien. Als het een klein filter is, is er niks aan het handje, maar als ik meerdere filters wil toepassen, duren de berekeningen te lang, en dan wordt niet alles afgehandeld:

Met onderstaande code (een klein filter) lukt het wel. Maar als ik meerder filters toepas, dan wordt de laatste regel niet bereikt(image = tmpImage).

Ik denk dat het event dat tijdens het toepassen van de filters (ProcessFrame), er alweer een nieuw event wordt afgevuurd, waardoor de afhandeling van die functie wordt afgebroken. Hoe kan ik dit probleem oplossen?

code om frames te processen
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void ProcessFrame(ref Bitmap image)
        {
            // check if there is a reference frame or not
            if (backgroundFrame == null)
            {
                // create initial backgroung image
                backgroundFrame = grayscaleFilter.Apply(image);

                // get image dimension
                width = image.Width;
                height = image.Height;
                
                return;
            }            

            //// filter ranges from image
            IntRange red = new IntRange(170, 255);
            IntRange blue = new IntRange(170, 255);
            IntRange green = new IntRange(170, 255);
            ColorFiltering cfilter = new ColorFiltering(red, green, blue);     
            Bitmap tmpImage = cfilter.Apply(image);
            image.Dispose();            
            image = tmpImage;
        }


Code die wordt uitgevoerd als er een nieuw frame binnen is.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void videoSource_NewFrame()
        {            
            try
            {
                //lock
                Monitor.Enter(this);
                if (image != null)
                {
                    image.Dispose();
                }                

                // Save the image, so it can be retrieved by the view                 
                image = (Bitmap)videoSource.Image.Clone();
                detection.ProcessFrame(ref image);                                
            }
            catch (Exception)
            {
            }
            finally
            {
                //unlock
                Monitor.Exit(this);
            }

           [....]        }

Memories of yesterday, will grow, but never die


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Verwerk iedere frame in een aparte thread, of werk je al met meerdere threads (aangezien ik daar Monitor.Enter en Monitor.Exit zie voorbijkomen) ?

https://fgheysels.github.io/


  • elmer25
  • Registratie: Februari 2002
  • Laatst online: 01-12-2021

elmer25

ooit was ik 25

Probeer ook zo efficient mogelijk te programmeren. Ik zie bijvoorbeeld dat je in de ProcessFrame routine voor elk beeld een nieuw ColorFilter maakt. Wellicht kun je dit filter op een hoger niveau maken en hergebruiken?

[ Voor 3% gewijzigd door elmer25 op 05-03-2007 11:10 ]


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 30-11 17:32
Nou,

het was echt een hele beschamende fout van mij :(

Er werd een exception gegenereerd in het filter dat bij mij niet toegepast werd. Deze werd wel afgevangen, maar er werd niks mee gedaan. En daarom werd de laatste regel code nooit bereikt. Wat ik nu doe:

op het moment dat er een nieuw frame binnenkomt, ontkoppel ik de eventhandler, en op het moment dat dat frame is geprocessed, koppel ik hem weer.

Memories of yesterday, will grow, but never die