Arhn - архитектура программирования

Обнаружение плохих кадров в OpenCV 2.4.9

Я знаю, что название немного расплывчато, но не знаю, как еще его описать.

CentOS с ffmpeg + OpenCV 2.4.9. Я работаю над простой системой обнаружения движения, которая использует поток с IP-камеры (h264).

Время от времени поток икает и выдает "плохой кадр" (см. Ссылку pic-bad.png ниже). Проблема в том, что эти кадры в значительной степени отличаются от предыдущих кадров и вызывают запуск события «движение», даже если фактического движения не произошло.

Изображения ниже поясняют проблему.

Хороший кадр (захвачено движение):

Хороший кадр

Плохой кадр (нет движения, просто сломанный кадр):

Плохой кадр

Плохой кадр ловится случайным образом. Я предполагаю, что могу сделать дефектный детектор кадров, анализируя (зацикливая) пиксели, идущие вниз из определенной позиции, чтобы увидеть, все ли они одинаковы, но мне интересно, есть ли другой, более эффективный, "по книге "подход к обнаружению плохих кадров такого типа и их пропуску.

Благодарю вас!

ИЗМЕНИТЬ ОБНОВЛЕНИЕ:

Кадр захватывается с помощью программы обнаружения движения C ++ через cvQueryFrame(camera);, поэтому я не взаимодействую напрямую с ffmpeg, OpenCV делает это на бэкэнде. Я использую последнюю версию ffmpeg, скомпилированную из источника git. Все библиотеки также обновлены (h264 и т. Д., Все загружены и скомпилированы вчера). Данные поступают из потока RTSP (ffserver). Я тестировал несколько камер (модели dahua 1–3 МП), и сбой кадра довольно устойчивый для всех из них, хотя это происходит не постоянно, а только время от времени (например, один раз в 10 минут).

12.05.2014

  • Как захватить рамку? 13.05.2014
  • Возможно, это кодек ffmpeg. Но вы можете проверить это на записанном видео. См. это 13.05.2014
  • Кадр захватывается с помощью программы обнаружения движения C ++ через cvQueryFrame(camera);, поэтому я не взаимодействую напрямую с ffmpeg, OpenCV делает это на бэкэнде. Я использую последнюю версию ffmpeg, скомпилированную из источника git. Все библиотеки также обновлены. Данные поступают из потока RTSP. Я тестировал несколько камер (дауа), и сбой кадра довольно устойчивый, хотя он происходит не постоянно, а только время от времени (например, один раз в 10 минут). 13.05.2014
  • cvQueryFrame(camera); Я думаю, что это версия C, но вы можете опубликовать код? Мэйб, тебе следует поставить cv::waitKey(10); в конце цикла for, это может быть слишком быстро (возможно ...) 13.05.2014
  • У меня там есть код ожидания, waitKey(50). Я видел это раньше довольно часто, но при просмотре видео с частотой ~ 30 кадров в секунду один такой кадр из 30, просматриваемый каждую секунду, не имеет большого значения, однако при анализе кадров это так. Я немного удивлен, что никто не видел такого поведения с ffmpeg. Я на 99% уверен, что это вызвано какой-то проблемой декодирования на стороне ffmpeg, мне просто любопытно, есть ли способ предотвратить это или автоматически обнаружить и сбросить. 13.05.2014
  • Я видел подобные вещи, когда пытался сохранить изображения и принудительно останавливал приложение. Тогда я получал неполное изображение. Попробуйте обновить ffmpeg, если еще не сделали 14.05.2014

Ответы:


1

Что мне приходит в голову при первом подходе, так это проверить несходство между примером действительного кадра и тем, который мы проверяем, путем подсчета пикселей, которые не совпадают. Разделив это число на площадь, мы получим процент, который измеряет несходство. Я бы предположил, что выше 0,5 мы можем сказать, что протестированный кадр недействителен, потому что он слишком сильно отличается от примера действительного.

Это предположение уместно только в том случае, если у вас есть статическая камера (она не движется) и объекты, которые могут двигаться перед ней, находятся не на кратчайшем расстоянии (зависит от фокусного расстояния, но если у вас, например, широкие линзы, поэтому объекты не должны появляются на расстоянии менее 30 см перед камерой, чтобы предотвратить ситуацию, когда объекты «прыгают» в кадр из ниоткуда и имеют его размер больше 50% площади кадра).

Здесь у вас есть функция opencv, которая делает то, что я сказал. Фактически, вы можете увеличить коэффициент несхожести, если считаете, что изменения движения будут более быстрыми. Обратите внимание, что первый параметр должен быть примером допустимого кадра.

bool IsBadFrame(const cv::Mat &goodFrame, const cv::Mat &nextFrame) {
    // assert(goodFrame.size() == nextFrame.size())

    cv::Mat g, g2;
    cv::cvtColor(goodFrame, g, CV_BGR2GRAY);
    cv::cvtColor(nextFrame, g2, CV_BGR2GRAY);

    cv::Mat diff = g2 != g;

    float similarity = (float)cv::countNonZero(diff) / (goodFrame.size().height * goodFrame.size().width);

    return similarity > 0.5f;
}
13.05.2014
  • Этот подход может сработать, я еще не тестировал его (я не перед машиной с кодом), но вот проблема ... Цель приложения C ++ + OpenCV в этом случае - обнаруживать движение. Движение обнаруживается путем сравнения текущего кадра с предыдущим кадром на предмет изменений (уже), вот почему мы видим движение, когда его в настоящее время нет ... Теперь, если автомобиль подъедет к камере, он будет приведет к огромному изменению пикселей / цветов / и т. д., но я думаю, что это также вызовет функцию IsBadFrame, описанную выше. 13.05.2014

  • 2

    Вы не упоминаете, используете ли вы командную строку или библиотеки ffmpeg, но в последнем случае вы можете проверить флаг плохого кадра (я забыл его точное описание) и просто игнорировать эти кадры.

    13.05.2014
  • Добавлено в посте редактирования. Это через C ++ и OpenCV, а не через ffmpeg напрямую. 13.05.2014

  • 3

    удалите waitKey(50) или измените его на waitKey(1). Я думаю, что opencv не создает новый поток для выполнения захвата. поэтому, когда есть пауза, это сбивает процедуры управления буфером, вызывая плохие кадры .. может быть?

    У меня есть камеры dahua, и я заметил, что с большей задержкой наблюдаются плохие кадры. И они полностью уходят с waitKey(1). Пауза не обязательно должна исходить от waitKey. Вызов подпрограмм также вызывает такие паузы и приводит к плохим кадрам, если они длятся достаточно долго.

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

    14.05.2014
  • Ах, очень интересно. Я собираюсь попробовать это завтра. Спасибо, что поделился! Обновит поток с результатом. 14.05.2014
  • @ user3630380: Сработало ли сокращение ожидания? И к какому решению вы пришли? Спасибо. 04.10.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..