Forum: PC-Programmierung 2 Webcams Sceenshot speichern


von Michael (Gast)


Lesenswert?

Hallo zusammen,


ich hab ein Probelm und zwar hahe ich hier einen Code um 2 Webcams mit 
Aforge.net anzusprechen.
Als Ergäzung hätte ich jetzt noch von jemand Kamerabild einen Screenshot 
geamcht, wenn ich auf Stop drück. Das Probelm ist, wenn ich einmal auf 
Stop drücke, dann ist das Bild weg und ich kann keinen weiteren 
Screenshot mehr machen. Hat mir jemand eine Lösung für mein Problem?

wäre super

Hier der Code
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
10
using AForge.Video;
11
using AForge.Video.DirectShow;
12
13
namespace Kamera
14
{
15
    public partial class Form1 : Form
16
    {
17
        private FilterInfoCollection VideoCaptureDevices;
18
        private VideoCaptureDevice FinalVideo_One;
19
        private VideoCaptureDevice FinalVideo_Two;
20
        private Bitmap video_one;
21
        private Bitmap video_two;
22
        private Bitmap Save_video_two;
23
        
24
25
        public Form1()
26
        {
27
            InitializeComponent();
28
        }
29
30
        private void Form1_Load(object sender, EventArgs e)
31
        {
32
            
33
            
34
            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
35
            foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
36
            {
37
               
38
                comboBox1.Items.Add(VideoCaptureDevice.Name);
39
                comboBox2.Items.Add(VideoCaptureDevice.Name);
40
            }
41
            comboBox1.SelectedIndex = 0;
42
            comboBox2.SelectedIndex = 0;
43
44
        }
45
46
        private void button1_Click(object sender, EventArgs e)
47
        {
48
            FinalVideo_One = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
49
            FinalVideo_One.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_One);
50
            FinalVideo_One.Start();
51
        }
52
        void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
53
        {
54
            video_one = (Bitmap)eventArgs.Frame.Clone();
55
            pictureBox1.Image = video_one;
56
            
57
            }
58
59
        private void button2_Click(object sender, EventArgs e)
60
        {
61
            if (FinalVideo_One.IsRunning)
62
            {
63
64
                FinalVideo_One.Stop();
65
            
66
            }
67
        }
68
69
        private void button3_Click(object sender, EventArgs e)
70
        {
71
            FinalVideo_Two = new VideoCaptureDevice(VideoCaptureDevices[comboBox2.SelectedIndex].MonikerString);
72
            FinalVideo_Two.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_Two);
73
            FinalVideo_Two.Start();
74
75
        }
76
        void FinalVideo_NewFrame_Two(object sender, NewFrameEventArgs eventArgs)
77
        {
78
            
79
            video_two = (Bitmap)eventArgs.Frame.Clone();
80
            pictureBox2.Image = video_two;
81
            //video_two.Save("C:\\video1.bmp");
82
            //video_two.Dispose();
83
        }
84
85
        private void button4_Click(object sender, EventArgs e)
86
        {
87
            if (FinalVideo_Two.IsRunning)
88
            {
89
                FinalVideo_Two.Stop();
90
                
91
                /*
92
                Bitmap Save_video_two = new Bitmap(2,2);
93
                Save_video_two = video_two;
94
                Save_video_two.Save("C:\\Documents and Settings\\Admin\\Desktop\\Cam2.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
95
                Save_video_two.Dispose();*/
96
            }
97
        }
98
       
99
    }
100
}

von Robert L. (lrlr)


Lesenswert?

>auf Stop drück


button1, button2, button3, button4

welcher is es denn...

von Michael (Gast)


Lesenswert?

Button 1 ist Start Webcam 1
Button 2 ist Stop Webcam 1

Button 3 ist Start Webcam 2
Button 4 ist Stop Webcam 2

Ich hätten gerne von jeder Webcam ein Bitmap gespeichert als Snapshot, 
wenn man auf Stop Webcam 1 oder Stop Webcam 2 drückt

von Sven H. (dsb_sven)


Lesenswert?

Sehr empfehlenswert ist es, insbesondere, wenn man Hilfe sucht bei 
Leuten, die das Programm nicht kennen, den Steuerelementen und den 
Variablen sinnvolle Namen zu geben. Du könntest deine Elemente z.B. so 
nennen:

btnStartWebcam1 für den Startknopf für Webcam 1.
btnStopWebcam2 für den Stopknopf für Webcam 2.
lblStatus könnte ein Label sein, dass den aktuellen Status anzeigt.
tbInputCommands könnte eine Textbox heißen, in die Kommandos eingegeben 
werden.

Damit wäre jedem sofort klar, was welches Element tut. Und, jetzt kommt 
der Knaller, Visual Studio benennt die EventHandler dann auch nach den 
Steuerelementenamen. Aber nur, wenn die Elemente den Namen schon haben, 
bevor du doppelt drauf klickst.

So, genug getadelt, jetzt zu deinem Problem:

Mir scheint, dass das Problem ist, dass du das Bitmap im EventHandler 
deklarierst. Wenn du das Bitmap in anderen Funktionen benötigst, musst 
du die Variable "Save_video_two" außerhalb der Funktion deklarieren 
und in der Funktion nur mit Werten füllen. Konkret würde das bedeuten, 
dass du den Teil "Bitmap Save_video_two;" oben bei den 
Variablendeklarationen stehen lassen kannst, aber im EventHandler 
lediglich steht "Save_video_two = new Bitmap(2,2);" (also ohne erneutes 
deklarieren mit "Bitmap") weil sonst eine neue, nur in der Funktion 
bekannte, Variable erstellt wird, die, beim verlassen der Funktion, 
wieder aus dem Speicher gelöscht wird.

Noch Fragen? :D

von Michael (Gast)


Lesenswert?

Danke! Ich werde es versuchen und wenn es noch ein Probalm gibt mich 
nochmal maleden.


Gruss

Michael

von Michael (Gast)


Lesenswert?

Danke für die Hilfe.


Mein Problem ist aber immer noch, dass wenn ich bei Cam2 z.B. auf Stop 
drücke, ich zwar ein Bild bekomme, allerdings dann der Live STream von 
meiner Webcam abbricht. Woran liegt das dann?



Gruss

Michael

Hier der neue Code
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
10
using AForge.Video;
11
using AForge.Video.DirectShow;
12
13
namespace Kamera
14
{
15
    public partial class Form1 : Form
16
    {
17
        private FilterInfoCollection VideoCaptureDevices;
18
        private VideoCaptureDevice FinalVideo_One;
19
        private VideoCaptureDevice FinalVideo_Two;
20
        private Bitmap video_one;
21
        private Bitmap video_two;
22
        private Bitmap Save_video_two;
23
        
24
25
        public Form1()
26
        {
27
            InitializeComponent();
28
        }
29
30
        private void Form1_Load(object sender, EventArgs e)
31
        {
32
            
33
            
34
            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
35
            foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
36
            {
37
               
38
                cb_Cam1.Items.Add(VideoCaptureDevice.Name);
39
                cb_Cam2.Items.Add(VideoCaptureDevice.Name);
40
            }
41
            cb_Cam1.SelectedIndex = 0;
42
            cb_Cam2.SelectedIndex = 0;
43
44
        }
45
46
        private void bt_StartCam1_Click(object sender, EventArgs e)
47
        {
48
            FinalVideo_One = new VideoCaptureDevice(VideoCaptureDevices[cb_Cam1.SelectedIndex].MonikerString);
49
            FinalVideo_One.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_One);
50
            FinalVideo_One.Start();
51
52
        }
53
        
54
55
        
56
        void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
57
        {
58
            video_one = (Bitmap)eventArgs.Frame.Clone();
59
            pb_Cam1_.Image = video_one;
60
            
61
            
62
            }
63
64
        private void bt_StopCam1_Click(object sender, EventArgs e)
65
        {
66
            if (FinalVideo_One.IsRunning)
67
            {
68
69
                FinalVideo_One.Stop();
70
71
72
            }
73
74
        }
75
76
        private void bt_StartCam2_Click(object sender, EventArgs e)
77
        {
78
79
            FinalVideo_Two = new VideoCaptureDevice(VideoCaptureDevices[cb_Cam2.SelectedIndex].MonikerString);
80
            FinalVideo_Two.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_Two);
81
            FinalVideo_Two.Start();
82
83
        }
84
85
        
86
        
87
        void FinalVideo_NewFrame_Two(object sender, NewFrameEventArgs eventArgs)
88
        {
89
            
90
            video_two = (Bitmap)eventArgs.Frame.Clone();
91
            pb_Cam2_.Image = video_two;
92
            //video_two.Save("C:\\video1.bmp");
93
            //video_two.Dispose();
94
        }
95
96
        
97
98
       
99
        
100
101
        private void bt_StopCam2_Click(object sender, EventArgs e)
102
        {
103
            if (FinalVideo_Two.IsRunning)
104
            {
105
                FinalVideo_Two.Stop();
106
107
                Save_video_two = new Bitmap(640, 480);
108
                Save_video_two = video_tw;
109
                Save_video_two.Save("C:\\Documents and Settings\\Admin\\Desktop\\Cam2.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
110
                Save_video_two.Dispose();
111
            }
112
        }

Danke nochmal

von Sven H. (dsb_sven)


Lesenswert?

Was steht denn in der Doku zu
1
VideoCaptureDevice.Stop();

von Michael (Gast)


Lesenswert?

Hallo Also ich habe jetzt rausgefunden.


Vielen Dank nochmal

von Sven H. (dsb_sven)


Lesenswert?

Verrätst du uns auch, was die Lösung ist?

von Uwe (Gast)


Lesenswert?

private void bt_StopCam2_Click(object sender, EventArgs e)
        {
            if (FinalVideo_Two.IsRunning)
            {
>                FinalVideo_Two.Stop();    //<<<<<DAS HIER WEGMACHEN

                Save_video_two = new Bitmap(640, 480);
                Save_video_two = video_tw;
                Save_video_two.Save("C:\\Documents and 
Settings\\Admin\\Desktop\\Cam2.bmp", 
System.Drawing.Imaging.ImageFormat.Bmp);
                Save_video_two.Dispose();
            }
        }

von Michael (Gast)


Lesenswert?

Ja klar, ich habe das jetzt so gelöst, dass ich einfach über den 
FinalVideo_NewFrame_One das Bild jeweis bearbeite und das Bild vorher 
auf Festplatte speicher.
1
  void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
2
        {
3
           
4
            video_one = (Bitmap)eventArgs.Frame.Clone();
5
            Save_Video_one = video_one;
6
            Save_Video_one.Save("C:\\Documents and Settings\\Admin\\Desktop\\Cam1.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
7
           
8
            grayscale();
9
            //invert();
10
            //color();
11
            BlobCounter bc = new BlobCounter();
12
13
            bc.ObjectsOrder = ObjectsOrder.Area;
14
            bc.MinHeight = 15;
15
            bc.MaxWidth = 15;
16
17
            bc.ProcessImage(video_one);
18
            video_one.Dispose();
19
20
            Blob[] blob = bc.GetObjectsInformation();
21
22
            if (blob.Length == 0 || blob.Length > 1)
23
            {
24
                lb_blob.Text = "Y Coord: Not valid";
25
                return;
26
            }
27
            IntPoint center_blob = blob[0].CenterOfGravity;
28
29
30
31
            //pb_Cam1_.Image = video_one;
32
            pb_Cam1_.Load("C:\\Documents and Settings\\Admin\\Desktop\\Cam1.bmp");
33
            pb_return.Image = video_one;
34
            }

Gruss

Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.