Datum:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
namespace Kamera
{
public partial class Form1 : Form
{
private FilterInfoCollection VideoCaptureDevices;
private VideoCaptureDevice FinalVideo_One;
private VideoCaptureDevice FinalVideo_Two;
private Bitmap video_one;
private Bitmap video_two;
private Bitmap Save_video_two;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
{
comboBox1.Items.Add(VideoCaptureDevice.Name);
comboBox2.Items.Add(VideoCaptureDevice.Name);
}
comboBox1.SelectedIndex = 0;
comboBox2.SelectedIndex = 0;
}
private void button1_Click(object sender, EventArgs e)
{
FinalVideo_One = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
FinalVideo_One.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_One);
FinalVideo_One.Start();
}
void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
{
video_one = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = video_one;
}
private void button2_Click(object sender, EventArgs e)
{
if (FinalVideo_One.IsRunning)
{
FinalVideo_One.Stop();
}
}
private void button3_Click(object sender, EventArgs e)
{
FinalVideo_Two = new VideoCaptureDevice(VideoCaptureDevices[comboBox2.SelectedIndex].MonikerString);
FinalVideo_Two.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_Two);
FinalVideo_Two.Start();
}
void FinalVideo_NewFrame_Two(object sender, NewFrameEventArgs eventArgs)
{
video_two = (Bitmap)eventArgs.Frame.Clone();
pictureBox2.Image = video_two;
//video_two.Save("C:\\video1.bmp");
//video_two.Dispose();
}
private void button4_Click(object sender, EventArgs e)
{
if (FinalVideo_Two.IsRunning)
{
FinalVideo_Two.Stop();
/*
Bitmap Save_video_two = new Bitmap(2,2);
Save_video_two = video_two;
Save_video_two.Save("C:\\Documents and Settings\\Admin\\Desktop\\Cam2.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
Save_video_two.Dispose();*/
}
}
}
}
|
Datum:
>auf Stop drück
button1, button2, button3, button4
welcher is es denn...
Datum:
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
Datum:
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
Datum:
Danke! Ich werde es versuchen und wenn es noch ein Probalm gibt mich nochmal maleden. Gruss Michael
Datum:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
namespace Kamera
{
public partial class Form1 : Form
{
private FilterInfoCollection VideoCaptureDevices;
private VideoCaptureDevice FinalVideo_One;
private VideoCaptureDevice FinalVideo_Two;
private Bitmap video_one;
private Bitmap video_two;
private Bitmap Save_video_two;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
{
cb_Cam1.Items.Add(VideoCaptureDevice.Name);
cb_Cam2.Items.Add(VideoCaptureDevice.Name);
}
cb_Cam1.SelectedIndex = 0;
cb_Cam2.SelectedIndex = 0;
}
private void bt_StartCam1_Click(object sender, EventArgs e)
{
FinalVideo_One = new VideoCaptureDevice(VideoCaptureDevices[cb_Cam1.SelectedIndex].MonikerString);
FinalVideo_One.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_One);
FinalVideo_One.Start();
}
void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
{
video_one = (Bitmap)eventArgs.Frame.Clone();
pb_Cam1_.Image = video_one;
}
private void bt_StopCam1_Click(object sender, EventArgs e)
{
if (FinalVideo_One.IsRunning)
{
FinalVideo_One.Stop();
}
}
private void bt_StartCam2_Click(object sender, EventArgs e)
{
FinalVideo_Two = new VideoCaptureDevice(VideoCaptureDevices[cb_Cam2.SelectedIndex].MonikerString);
FinalVideo_Two.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame_Two);
FinalVideo_Two.Start();
}
void FinalVideo_NewFrame_Two(object sender, NewFrameEventArgs eventArgs)
{
video_two = (Bitmap)eventArgs.Frame.Clone();
pb_Cam2_.Image = video_two;
//video_two.Save("C:\\video1.bmp");
//video_two.Dispose();
}
private void bt_StopCam2_Click(object sender, EventArgs e)
{
if (FinalVideo_Two.IsRunning)
{
FinalVideo_Two.Stop();
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();
}
}
|
Danke nochmal
Datum:
Hallo Also ich habe jetzt rausgefunden. Vielen Dank nochmal
Datum:
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();
}
}
Datum:
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.
void FinalVideo_NewFrame_One(object sender, NewFrameEventArgs eventArgs)
{
video_one = (Bitmap)eventArgs.Frame.Clone();
Save_Video_one = video_one;
Save_Video_one.Save("C:\\Documents and Settings\\Admin\\Desktop\\Cam1.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
grayscale();
//invert();
//color();
BlobCounter bc = new BlobCounter();
bc.ObjectsOrder = ObjectsOrder.Area;
bc.MinHeight = 15;
bc.MaxWidth = 15;
bc.ProcessImage(video_one);
video_one.Dispose();
Blob[] blob = bc.GetObjectsInformation();
if (blob.Length == 0 || blob.Length > 1)
{
lb_blob.Text = "Y Coord: Not valid";
return;
}
IntPoint center_blob = blob[0].CenterOfGravity;
//pb_Cam1_.Image = video_one;
pb_Cam1_.Load("C:\\Documents and Settings\\Admin\\Desktop\\Cam1.bmp");
pb_return.Image = video_one;
}
|
Gruss Michael