У меня есть камера, которая будет стационарной, указал в закрытом помещении область. Люди пройдут мимо камеры приблизительно в 5 метрах из него. Используя OpenCV, я хочу обнаружить людей, проходящих мимо - мой идеальный возврат является массивом обнаруженных людей с ограничительными прямоугольниками.
Я посмотрел на несколько из встроенных образцов:
Может кто-либо для давания представление или образцы для того, чтобы сделать это - предпочтительно в Python?
Позвольте реализовать 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).
CString MyFunc (double x, double y)
менее эффективен, чем
void MyFunc (double x, double y, CString & Result)
Если MyFunc написан чисто, они должны быть примерно одинаковыми. Компилятор должен иметь возможность использовать NRVO . Похоже, вы профилировали и обнаружили, что его нет - я просто говорю, что он может больше соответствовать вашим критериям, например, «минимальная обфускация кода», чтобы немного переставить саму функцию, чтобы позволить NRVO произойти.
Еще несколько вещей, которые нужно попробовать:
Sorted < T >
), которая
сделать такие предположения явными. Это
способ, если у вас есть метод, который принимает
a Отсортированный < вектор < T > >
, например,
и вы даете ему отсортированный вектор, он
проходит прямо - но если
дать ему вектор < T >
, он должен будет
создал отсортированный < вектор < T > >
, в
какой момент он будет сортировать его. Можно
вручную подтвердить, что он отсортирован
используя альтернативный конструктор,
но это значительно облегчает ношение
ваши предположения вокруг и, возможно,
ловите места, которые у вас могут быть
в противном случае пропущено. Для уменьшения объема операций следует использовать хорошо известные узоры и, возможно, даже рамки.
Относительно легко увидеть архитектурные ошибки, когда проект завершен, но это заключается в природе того, что мы делаем.
Я считаю, что рекомендуется постоянно проводить обзоры архитектуры. Это не шаг, который ты просто «выполнила.»
-121--4859581-Это похоже на проект, который мы сделали в рамках курса компьютерного зрения, и я могу сказать вам прямо сейчас, что это трудная проблема, чтобы получить право.
Вы можете использовать сегментацию переднего плана/фона, найти все блобы, а затем решить, что они человек. Проблема в том, что это не будет работать очень хорошо, так как люди, как правило, идут вместе, проходят мимо друг друга и так далее, так что BLOB вполне может состоять из двух человек, и тогда вы увидите, что BLOB расщепляется и сливается, когда они идут вдоль.
Вам понадобится какой-то способ различения нескольких лиц в одном большом двоичном объекте. Это не проблема, я ожидаю, что кто-то сможет ответить в одном SO-пост.
Мой совет - погрузиться в доступные исследования и посмотреть, сможете ли вы там что-нибудь найти. Проблема не является неразрешимой, учитывая, что существуют продукты, которые делают это: Autoliv имеет продукт для обнаружения пешеходов с помощью ИК-камеры на автомобиле, и я видел другие продукты, которые имеют дело с подсчетом покупателей, входящих и выходящих из магазинов.
Это явно нетривиальная задача. В поисках вдохновения вам придется заглянуть в научные публикации ( Google Scholar - ваш друг). Вот статья об обнаружении и отслеживании людей: Отслеживание человека путем поиска режима быстрого среднего сдвига
Ник,
Вы ищете не обнаружение людей, а обнаружение движения. Если вы расскажете нам намного больше о том, что вы пытаетесь решить / сделать, мы сможем лучше ответить. В любом случае, есть много способов сделать обнаружение движения в зависимости от того, что вы собираетесь делать с результатами. Самым простым было бы дифференцирование с последующим установлением пороговых значений, а сложным - правильное фоновое моделирование -> вычитание переднего плана -> морфологические операции -> анализ связанных компонентов с последующим анализом блобов, если требуется. Загрузите код opencv и посмотрите каталог с образцами. Вы можете увидеть то, что ищете. Также есть книга Oreilly о OCV.
Надеюсь, это поможет, Нанд