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
сам используется для обнаружения людей, поэтому вам не нужно проверять их, поскольку они должны быть людьми в соответствии с вашей настройкой. С другой стороны, вы можете настроить свой порог, чтобы контролировать его обнаруженное качество.