OpenCV:如何使用HOGDescriptor :: detect方法?

时间:2014-01-17 18:15:10

标签: c++ opencv image-processing

我已成功跟踪视频中的移动对象。 http://ww1.sinaimg.cn/mw690/63a9e398jw1ecn39e3togj20jv0g1gnv.jpg

但是我想决定一个物体是否是人物。我在OpenCV中尝试了HOGDescriptor。 HOGDescriptor有两种检测人的方法:HOGDescriptor::detectHOGDescriptor::detectMultiScale。 OpenCV “sources \ samples \ cpp \ peopledetect.cpp”演示了如何使用HOGDescriptor::detectMultiScale,它以不同的比例搜索图像并且非常慢。

就我而言,我已经跟踪了矩形中的对象。我认为使用HOGDescriptor::detect检测矩形内部会更快。但OpenCV文档只有gpu::HOGDescriptor::detect(我仍然无法猜测如何使用它)而错过了HOGDescriptor::detect。我想使用HOGDescriptor::detect

有人能为我提供一些c ++代码段,演示HOGDescriptor::detect的用法吗?

感谢。

2 个答案:

答案 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本身用于检测人员,因此您不需要根据您的设置验证它们,因为它们应该是人。另一方面,您可以设置其阈值以控制其检测到的质量。