Как я могу обнаружить и отследить людей использование OpenCV?

У меня есть камера, которая будет стационарной, указал в закрытом помещении область. Люди пройдут мимо камеры приблизительно в 5 метрах из него. Используя OpenCV, я хочу обнаружить людей, проходящих мимо - мой идеальный возврат является массивом обнаруженных людей с ограничительными прямоугольниками.

Я посмотрел на несколько из встроенных образцов:

  • Ни один из образцов Python действительно не применяется
  • Блоб C, отслеживающий образец, выглядит многообещающим, но не принимает живое видео, которое делает тестирование трудным. Это является также самым сложным из образцов, делая извлечение соответствующего знания и преобразование его к API Python проблематичными.
  • C 'motempl' образец также выглядит многообещающим, в котором он вычисляет контур от последующих видеокадров. По-видимому, я мог затем использовать это, чтобы найти сильно соединенные компоненты и извлечь отдельные блобы и их ограничительные рамки - но меня все еще оставляют, пытаясь выяснить способ определить блобы, найденные в последующих кадрах как тот же блоб.

Может кто-либо для давания представление или образцы для того, чтобы сделать это - предпочтительно в Python?

35
задан Jav_Rock 11 June 2012 в 20:38
поделиться

4 ответа

Позвольте реализовать Callable < T > вместо Thread или Runnable . Здесь T должен представлять тип результата. Для его выполнения используйте ExecutingService . Он возвращает результат в вкусе Future < V > .

Вот SSCCE с Последовательностей в качестве T , просто скопируйте 'n' paste 'n'.

package com.stackoverflow.q2300433;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {
    public static void main(String... args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());
        System.out.println(future.get()); // Prints "result" after 2 secs.

        // Or if you have multiple tasks.
        // List<Future<String>> futures = executor.invokeAll(Arrays.asList(new Task()));
        // for (Future<String> future : futures) {
        //     System.out.println(future.get());
        // }

        executor.shutdown(); // Important!
    }
}

class Task implements Callable<String> {
    public String call() throws Exception {
        Thread.sleep(2000);
        return "result";
    }
}
-121--3311321-

Последняя SVN-версия OpenCV содержит (без документов) реализацию обнаружения пешеходов на основе HOG. Он даже поставляется с предварительно обученным детектором и оболочкой для питона. Основное использование:

from cv import *

storage = CreateMemStorage(0)
img = LoadImage(file)  # or read from camera

found = list(HOGDetectMultiScale(img, storage, win_stride=(8,8),
                padding=(32,32), scale=1.05, group_threshold=2))

Поэтому вместо отслеживания можно просто запустить детектор в каждом кадре и использовать его вывод напрямую.

См. src/cvaux/cvhog.cpp для реализации и samples/python/peopledetect.py для более полного примера питона (оба в источниках OpenCV).

27
ответ дан 27 November 2019 в 15:41
поделиться

CString MyFunc (double x, double y)

менее эффективен, чем

void MyFunc (double x, double y, CString & Result)

Если MyFunc написан чисто, они должны быть примерно одинаковыми. Компилятор должен иметь возможность использовать NRVO . Похоже, вы профилировали и обнаружили, что его нет - я просто говорю, что он может больше соответствовать вашим критериям, например, «минимальная обфускация кода», чтобы немного переставить саму функцию, чтобы позволить NRVO произойти.

Еще несколько вещей, которые нужно попробовать:

  1. memoization (похоже на ваше кэширование повторных поисков, но более сосредоточено на разрешении дерева/графика, при наличии).
  2. Использование поплавков вместо двойных, если вам не нужны дополнительные точность (или, может быть, даже ints, если вы может).
  3. Используйте типы для пометки допущений (вы упомянули сортированные массивы - другой общий - строчный последовательности). Создание производного или тип оболочки (например, Sorted < T > ), которая сделать такие предположения явными. Это способ, если у вас есть метод, который принимает a Отсортированный < вектор < T > > , например, и вы даете ему отсортированный вектор, он проходит прямо - но если дать ему вектор < T > , он должен будет создал отсортированный < вектор < T > > , в какой момент он будет сортировать его. Можно вручную подтвердить, что он отсортирован используя альтернативный конструктор, но это значительно облегчает ношение ваши предположения вокруг и, возможно, ловите места, которые у вас могут быть в противном случае пропущено.
  4. Не сдавайтесь на линии и т.д. Убедитесь, что вы полностью осведомлены о том, когда они должны помочь и когда должно препятствовать. В некоторых случаях они действительно может изменить ситуацию - но возможно, нет, если вы просто имеете дело с они произвольно.
  5. Вы можете воспользоваться преимуществами flyweight или объединенного объекта распределители .
  6. При многопоточности постарайтесь минимизировать любые взаимодействия, чтобы можно уменьшить количество кода для этого требуется блокировка. Часто принимая копии даже довольно дорогих объекты могут быть меньше накладных расходов чем мьютекс. Очевидное использование преимуществ атомных типов, где можно.
-121--4546472-

Для уменьшения объема операций следует использовать хорошо известные узоры и, возможно, даже рамки.

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

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

-121--4859581-

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

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

Вам понадобится какой-то способ различения нескольких лиц в одном большом двоичном объекте. Это не проблема, я ожидаю, что кто-то сможет ответить в одном SO-пост.

Мой совет - погрузиться в доступные исследования и посмотреть, сможете ли вы там что-нибудь найти. Проблема не является неразрешимой, учитывая, что существуют продукты, которые делают это: Autoliv имеет продукт для обнаружения пешеходов с помощью ИК-камеры на автомобиле, и я видел другие продукты, которые имеют дело с подсчетом покупателей, входящих и выходящих из магазинов.

2
ответ дан 27 November 2019 в 15:41
поделиться

Это явно нетривиальная задача. В поисках вдохновения вам придется заглянуть в научные публикации ( Google Scholar - ваш друг). Вот статья об обнаружении и отслеживании людей: Отслеживание человека путем поиска режима быстрого среднего сдвига

4
ответ дан 27 November 2019 в 15:41
поделиться

Ник,

Вы ищете не обнаружение людей, а обнаружение движения. Если вы расскажете нам намного больше о том, что вы пытаетесь решить / сделать, мы сможем лучше ответить. В любом случае, есть много способов сделать обнаружение движения в зависимости от того, что вы собираетесь делать с результатами. Самым простым было бы дифференцирование с последующим установлением пороговых значений, а сложным - правильное фоновое моделирование -> вычитание переднего плана -> морфологические операции -> анализ связанных компонентов с последующим анализом блобов, если требуется. Загрузите код opencv и посмотрите каталог с образцами. Вы можете увидеть то, что ищете. Также есть книга Oreilly о OCV.

Надеюсь, это поможет, Нанд

5
ответ дан 27 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: