Определение движения

Я действительно не могу обойти эту тему, поэтому я надеюсь, что кто-то может дать мне небольшую руку ^^

Я пытаюсь обнаружить движение в С# через свою веб-камеру.

До сих пор я пытался использовать несколько библиотек (AForge Lib), но не смог, потому что не понял, как его использовать.

Сначала мне просто хотелось сравнить пиксели с текущим фреймом с последним, но это оказалось таким же, как utter s ** t: I

Сейчас моя веб-камера запускает событие "webcam_ImageCaptured" каждый раз, когда изображение с веб-камеры составляет 5-10 кадров в секунду.

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

Кто-нибудь понял, как я могу сделать это довольно просто (насколько это возможно)?

Ответ 1

Получение обнаружения движения для работы с использованием библиотек, которые вы упоминаете, тривиально. Ниже приводится пример AForge (версия 2.2.4). Он работает с видеофайлом, но вы можете легко адаптировать его к событию веб-камеры.

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

Мои приложения обрабатывают видео 720p на 120FPS на очень быстрой машине с SSD и около 50FPS на моем ноутбуке разработки.

public static void Main()
{    
    float motionLevel = 0F;
    System.Drawing.Bitmap bitmap = null;
    AForge.Video.FFMPEG.VideoFileReader reader = null;
    AForge.Vision.Motion.MotionDetector motionDetector = null;    

    motionDetector = GetDefaultMotionDetector();

    reader.Open(@"C:\Temp.wmv");

    while (true)
    {
        bitmap = reader.ReadVideoFrame();
        if (bitmap == null) break;

        // motionLevel will indicate the amount of motion as a percentage.
        motionLevel = motionDetector.ProcessFrame(bitmap);

        // You can also access the detected motion blobs as follows:
        // ((AForge.Vision.Motion.BlobCountingObjectsProcessing) motionDetector.Processor).ObjectRectangles [i]...
    }

    reader.Close();
}

// Play around with this function to tweak results.
public static AForge.Vision.Motion.MotionDetector GetDefaultMotionDetector ()
{
    AForge.Vision.Motion.IMotionDetector detector = null;
    AForge.Vision.Motion.IMotionProcessing processor = null;
    AForge.Vision.Motion.MotionDetector motionDetector = null;

    //detector = new AForge.Vision.Motion.TwoFramesDifferenceDetector()
    //{
    //  DifferenceThreshold = 15,
    //  SuppressNoise = true
    //};

    //detector = new AForge.Vision.Motion.CustomFrameDifferenceDetector()
    //{
    //  DifferenceThreshold = 15,
    //  KeepObjectsEdges = true,
    //  SuppressNoise = true
    //};

    detector = new AForge.Vision.Motion.SimpleBackgroundModelingDetector()
    {
        DifferenceThreshold = 10,
        FramesPerBackgroundUpdate = 10,
        KeepObjectsEdges = true,
        MillisecondsPerBackgroundUpdate = 0,
        SuppressNoise = true
    };

    //processor = new AForge.Vision.Motion.GridMotionAreaProcessing()
    //{
    //  HighlightColor = System.Drawing.Color.Red,
    //  HighlightMotionGrid = true,
    //  GridWidth = 100,
    //  GridHeight = 100,
    //  MotionAmountToHighlight = 100F
    //};

    processor = new AForge.Vision.Motion.BlobCountingObjectsProcessing()
    {
        HighlightColor = System.Drawing.Color.Red,
        HighlightMotionRegions = true,
        MinObjectsHeight = 10,
        MinObjectsWidth = 10
    };

    motionDetector = new AForge.Vision.Motion.MotionDetector(detector, processor);

    return (motionDetector);
}

Ответ 2

Обнаружение движения - сложный вопрос, и он требует большой вычислительной мощности.

Попробуйте ограничить то, что вы хотите обнаружить первым. С усложнением: хотите ли вы определить, есть ли движение или нет? Вы хотите определить, сколько движений? Вы хотите определить, какие области изображения действительно движутся?

Я предполагаю, что вы просто хотите знать, когда что-то изменилось:

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