OpenCV: How to use HOGDescriptor::detect method?

前端 未结 2 641
逝去的感伤
逝去的感伤 2021-02-02 01:13

I have succeeded in tracking moving objects in a video. \"http://ww1.sinaimg.cn/mw690/63a9e398jw1ecn39e3togj20jv0g1gnv.jpg\"

相关标签:
2条回答
  • 2021-02-02 02:06

    Since you already have a list of objects, you can call the HOGDescriptor::detect method for all objects and check the output foundLocations array. If it is not empty the object was classified as a person. The only thing is that HOG works with 64x128 windows by default, so you need to rescale your objects:

    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
        }
    }
    
    0 讨论(0)
  • 2021-02-02 02:10
    • If you don't cmake OpenCV with CUDA enabled, calling gpu::HOGDescriptor::detect will be equal to call HOGDescriptor::detect. No GPU is called.

    • Also for code, you can use

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

    Edit:

    However I want to decide if an object is person or not.

    I don't think that you need this step. HOGDescriptor::detect itself is used to detect people, so you don't need to verify them as they are supposed to be people according to your setup. On the other hand, you can setup its threshold to control its detected quality.

    0 讨论(0)
提交回复
热议问题