Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

For GPU version of the HOG, pass in the third parameter confidence as &vector<double> would work.

Note: you need to configure group_threshold 0 to retrieve the detector scores. See the example code below.

Documentation link: http://docs.opencv.org/3.2.0/de/da6/classcv_1_1cuda_1_1HOG.html#af4a3bf27a5a04817c6d584d9108f50b7


Below is a minimal working example in case you are interested:

// g++ mwp.cpp -o hog --std=c++11 `pkg-config --cflags --libs opencv`
#include "opencv2/core/core.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/objdetect.hpp"
#include <iostream>

using namespace cv;

static void printUsage() { std::cout << "Usage: hog <image>\n"; }

int main(int argc, char **argv) {
  if (argc < 2) {
    printUsage();
    return 0;
  }

  //
  // Load Image
  //
  Mat frame = imread(argv[1], CV_LOAD_IMAGE_COLOR);
  Mat img;
  cvtColor(frame, img, COLOR_BGR2BGRA);
  cuda::GpuMat gpu_img;
  gpu_img.upload(img);

  //
  // Create Hog
  //
  Size win_size(64, 128);
  Size block_size(16, 16);
  Size block_stride(8, 8);
  Size cell_size(8, 8);
  int nbins = 9;
  cv::Ptr<cv::cuda::HOG> hog = cv::cuda::HOG::create(
      win_size, block_size, block_stride, cell_size, nbins);
  Mat detector = hog->getDefaultPeopleDetector();
  hog->setSVMDetector(detector);

  //
  // Do detection
  //
  hog->setGroupThreshold(0); // Important
  std::vector<Rect> found;
  std::vector<double> confidences;
  hog->detectMultiScale(gpu_img, found, &confidences);

  //
  // Show result
  //
  assert(found.size() == confidences.size());
  for (int i = 0; i < found.size(); i++) {
    Rect r = found[i];
    printf("(%d, %d, %d, %d), %3.2f\n", r.x, r.y, r.width, r.height,
           confidences[i]);
  }

  return 0;
}