OpenCV HOG is not detecting people
Hi,
Please have a look at the below code
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
using namespace cv;
using namespace std;
void help()
{
printf(
"\nDemonstrate the use of the HoG descriptor using\n"
" HOGDescriptor::hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());\n"
"Usage:\n"
"./peopledetect (<image_filename> | <image_list>.txt)\n\n");
}
int main()
{
Mat img;
char _filename[1024];
img = imread("C:/Users/yohan/Desktop/dogwalker.jpg");
HOGDescriptor hog;
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
namedWindow("people detector", 1);
for(;;)
{
vector<Rect> found, found_filtered;
double t = (double)getTickCount();
// run the detector with default parameters. to get a higher hit-rate
// (and more false alarms, respectively), decrease the hitThreshold and
// groupThreshold (set groupThreshold to 0 to turn off the grouping completely).
hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
t = (double)getTickCount() - t;
printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency());
size_t i, j;
for( i = 0; i < found.size(); i++ )
{
Rect r = found[i];
for( j = 0; j < found.size(); j++ )
if( j != i && (r & found[j]) == r)
break;
if( j == found.size() )
found_filtered.push_back(r);
}
for( i = 0; i < found_filtered.size(); i++ )
{
Rect r = found_filtered[i];
// the HOG detector returns slightly larger rectangles than the real objects.
// so we slightly shrink the rectangles to get a nicer output.
r.x += cvRound(r.width*0.1);
r.width = cvRound(r.width*0.8);
r.y += cvRound(r.height*0.07);
r.height = cvRound(r.height*0.8);
rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
}
imshow("people detector", img);
int c = waitKey(0) & 255;
break;
}
return 0;
}
This is the OpenCV code for detecting humans. But I noticed that this do not detect people in most cases, for an example, please have a look at the below image.
If you run the above code on this, this will not detect the person. What is wrong here? Please help.
Actually, your step of found to found_filtered is probably screwing your detections up, not to mention the fact that it is completely useless since you are using the grouping parameter already. Remove that part and it will work just fine in 2.4.9.
@StevenPuttemans: Thanks for the reply and very sorry for the delay of my reply, I do not get email notifications! anyways, I did not understand what you mentioned. Mind providing a code sample?
Email notifications do not work on this forum, even if you ask to send them ... it is a known bug. I cannot provide full code samples. You have a piece of code like this:
But afaik you do not need anything like this to filter out detections. Cut it out and retry your code!