OpenCV: Как использовать метод HOGDescriptor:: detect?

Мне удалось отслеживать движущиеся объекты в видео. http://ww1.sinaimg.cn/mw690/63a9e398jw1ecn39e3togj20jv0g1gnv.jpg

Однако я хочу решить, является ли объект человеком или нет. Я пробовал HOGDescriptor в OpenCV. HOGDescriptor имеет два метода обнаружения людей: HOGDescriptor::detect и HOGDescriptor::detectMultiScale. OpenCV "sources\samples\cpp\peopledetect.cpp" демонстрирует, как использовать HOGDescriptor::detectMultiScale, которые выполняют поиск по изображению в разных масштабах и очень медленно.

В моем случае я отслеживал объекты в прямоугольнике. Я думаю, что использование HOGDescriptor::detect для обнаружения внутри прямоугольника будет намного быстрее. Но документ OpenCV имеет только gpu::HOGDescriptor::detect (я до сих пор не могу догадаться, как его использовать) и пропустил HOGDescriptor::detect. Я хочу использовать HOGDescriptor::detect.

Может ли кто-нибудь предоставить мне некоторый фрагмент кода С++, демонстрирующий использование HOGDescriptor::detect?

спасибо.

Ответ 1

Поскольку у вас уже есть список объектов, вы можете вызвать метод HOGDescriptor::detect для всех объектов и проверить выходной массив foundLocations. Если он не пуст, объект классифицируется как человек. Единственное, что HOG работает с окнами 64x128 по умолчанию, поэтому вам нужно перемасштабировать ваши объекты:

std::vector<cv::Rect> movingObjects = ...;

cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Point> foundLocations;
for (size_t i = 0; i < movingObjects.size(); ++i)
{
    cv::Mat roi = image(movingObjects[i]);
    cv::Mat window;
    cv::resize(roi, window, cv::Size(64, 128));
    hog.detect(window, foundLocations);
    if (!foundLocations.empty())
    {
        // movingObjects[i] is a person
    }
}

Ответ 2

  • Если вы не используете OpenCV с включенным CUDA, вызов gpu::HOGDescriptor::detect будет равен вызову HOGDescriptor::detect. GPU не называется.

  • Также для кода вы можете использовать

    GpuMat img;
    vector<Point> found_locations;
    gpu::HOGDescriptor::detect(img, found_locations);
    if(!found_locations.empty())
    {
        // img contains/is a real person 
    }
    

Изменить:

Однако я хочу решить, является ли объект человеком или нет.

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