Ok, ho cercato di fare qualcosa di specifico con il video da una webcam. Ho un microscopio Lumenera Infinity 2 di cui sto cercando di prelevare il feed, e voglio essere in grado di modificare il feed così com'è. Poiché non riuscivo a trovare un modo per farlo usando il Video Source Player, ho deciso di tira ogni fotogramma (max di 15fps per la fotocamera) come bitmap in modo da poter apportare le mie modifiche lì.Perdita di memoria nel codice webcam
Il problema è: ho una perdita di memoria ENORME. Quando eseguo il video usando solo videoSourcePlayer, si aggira sull'utilizzo di circa 30 mega. Quando eseguo il pull dei frame come bitmap, si interrompe 1 gigabyte di memoria in pochi secondi.
Cosa mi manca, qui? Ho pensato che la raccolta automatica dei rifiuti avrebbe recuperato i vecchi fotogrammi non appena fossero diventati inaccessibili. Dovrei provare a forzare la garbage collection su bitmap? O è qualcosa di completamente diverso e mi manca assurdamente.
FilterInfoCollection captureDevices;
VideoCaptureDevice cam;
Bitmap bitmap;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
captureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (captureDevices.Count == 0)
throw new ApplicationException();
CameraSelectComboBox.Items.Clear();
foreach (FilterInfo device in captureDevices)
{
CameraSelectComboBox.Items.Add(device.Name);
}
CameraSelectComboBox.SelectedIndex = 0;
CameraSelectComboBox.Enabled = true;
}
catch (ApplicationException)
{
CameraSelectComboBox.Enabled = false;
}
}
private void connectButton_Click(object sender, EventArgs e)
{
cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
cam.NewFrame -= Handle_New_Frame; //Just to avoid the possibility of a second event handler being put on
cam.NewFrame += new AForge.Video.NewFrameEventHandler(Handle_New_Frame);
videoSourcePlayer1.Visible = false;
cam.Start();
//videoPictureBox1.Visible = false;
//videoSourcePlayer1.VideoSource = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
//videoSourcePlayer1.Start();
}
private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
bitmap = (Bitmap)eventArgs.Frame.Clone();
videoPictureBox1.Image = bitmap;
}
'Bitmap' è' IDisposable' – I4V
Solo una rapida ipotesi: forse l'evento Handle New Frame? sta clonando un frame, quante volte e quanto velocemente viene chiamato questo evento? – Max
Sto assumendo per ogni frame, quindi un massimo di (basato sull'hardware) 15 volte al secondo. Controllerò e assicurarmi che sia la –