我已成功跟踪视频中的移动对象。
但是我想决定一个物体是否是人物。我在OpenCV中尝试了HOGDescriptor
。 HOGDescriptor有两种检测人的方法:HOGDescriptor::detect
和HOGDescriptor::detectMultiScale
。 OpenCV “sources \ samples \ cpp \ peopledetect.cpp”演示了如何使用HOGDescriptor::detectMultiScale
,它以不同的比例搜索图像并且非常慢。
就我而言,我已经跟踪了矩形中的对象。我认为使用HOGDescriptor::detect
检测矩形内部会更快。但OpenCV文档只有gpu::HOGDescriptor::detect
(我仍然无法猜测如何使用它)而错过了HOGDescriptor::detect
。我想使用HOGDescriptor::detect
。
有人能为我提供一些c ++代码段,演示HOGDescriptor::detect
的用法吗?
感谢。
答案 0 :(得分:11)
由于您已有对象列表,因此可以为所有对象调用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
}
}
答案 1 :(得分:1)
如果您未在启用CUDA
的情况下启动OpenCV,则调用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
本身用于检测人员,因此您不需要根据您的设置验证它们,因为它们应该是人。另一方面,您可以设置其阈值以控制其检测到的质量。