Как делать фото с веб-камеры каждую минуту?

Я пытаюсь сделать снимок через веб-камеру. Это мой код:

using System;
using System.Text;
using System.Drawing;
using System.Threading;

using AForge.Video.DirectShow;
using AForge.Video;

namespace WebCamShot
{
    class Program
    {
        static FilterInfoCollection WebcamColl;
        static VideoCaptureDevice Device;

        static void Main(string[] args)
        {
            WebcamColl = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            Console.WriteLine("Press Any Key To Capture Photo !");
            Console.ReadKey();
            Device = new VideoCaptureDevice(WebcamColl[0].MonikerString);
            Device.NewFrame += Device_NewFrame;
            Device.Start();
            Console.ReadLine();
        }

        static void Device_NewFrame(object sender, NewFrameEventArgs e)
        {
            Bitmap Bmp = (Bitmap)e.Frame.Clone();
            Bmp.Save("D:\\Foo\\Bar.png");
            Console.WriteLine("Snapshot Saved.");
            /*
            Console.WriteLine("Stopping ...");
            Device.SignalToStop();
            Console.WriteLine("Stopped .");
            */
        }
    }
}

Это работает хорошо, но теперь я хочу использовать свой код для создания моментального снимка каждую минуту.

По этой причине я добавил эту строку кода: Thread.Sleep(1000 * 60); // 1000 Milliseconds (1 Second) * 60 == One minute.

К сожалению, эта строка не дает мне желаемого результата - она ​​по-прежнему делает снимки, как и раньше, но просто сохраняет фотографии в файл каждую минуту. Что я на самом деле хочу сделать, так это то, что мой код будет запускать событие «Device_NewFrame» каждую минуту.

Как мне это сделать? Я буду рад получить некоторую помощь .. Спасибо!

EDIT: Как предложил Армен Агаджанян, я добавил в свой код таймер. Этот таймер Инициализирует объект устройства каждую минуту, регистрирует новый объект устройства в событии Device_NewFrame и запускает действие устройства. После этого раскомментирую этот код в теле события:

Console.WriteLine("Stopping ...");
Device.SignalToStop();
Console.WriteLine("Stopped .");

Теперь код делает снимок каждую минуту.


person Aviv    schedule 23.03.2014    source источник
comment
Не могли бы вы взять результат события и нарисовать изображение в окне изображения, не показывая при этом кадры, отправленные с устройства камеры?   -  person Ross Bush    schedule 23.03.2014


Ответы (2)


Я бы рекомендовал использовать событие Timer.Elapsed. Реализация проста и чиста. http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed(v=vs.110).aspx

person Armen Aghajanyan    schedule 23.03.2014

 private static void TimerThread(object obj)
    {
        int delay = (int)obj;
        while (true)
        {
            takePhotos = true;
            Thread.Sleep(delay);
        }
    }
static void Main(string[] args)
    {
        WebcamColl = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        Console.WriteLine("Press Any Key To Capture Photo !");
        Console.ReadKey();
        Device = new VideoCaptureDevice(WebcamColl[0].MonikerString);
        Device.NewFrame += Device_NewFrame;
        Device.Start();
        Thread timer=new Thread(TimerThread);
         timer.Start(60000);
        Console.ReadLine();
    }

    static void Device_NewFrame(object sender, NewFrameEventArgs e)
    {
       if(!takePhotos)return;
        Bitmap Bmp = (Bitmap)e.Frame.Clone();
        Bmp.Save("D:\\Foo\\Bar.png");
        takePhotos=false;
        Console.WriteLine("Snapshot Saved.");
        /*
        Console.WriteLine("Stopping ...");
        Device.SignalToStop();
        Console.WriteLine("Stopped .");
        */
    }

Объявите статическую переменную takePhotos и инициализируйте ее значением true.

person manohar koukuntla    schedule 13.11.2017