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
Code die wordt uitgevoerd als er een nieuw frame binnen is.
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