1 | initial version |
You are lucky that I am currently teaching a class on this and just made a sample... but you will need to adapt it to your needs and make it more robust for your case
```
using namespace std; using namespace cv; using namespace cv::ml;
int main( int argc, const char** argv ) { /// Use the cmdlineparser to process input arguments CommandLineParser parser(argc, argv, "{ help h | | show this message }" "{ video v | | (required) path to video }" );
/// If help is entered
if (parser.has("help")){
parser.printMessage();
return 0;
}
/// Parse arguments
string video_location(parser.get<string>("video"));
if (video_location.empty()){
parser.printMessage();
return -1;
}
/// Create a videoreader interface
VideoCapture cap(video_location);
Mat current_frame;
/// Set up the pedestrian detector --> let us take the default one
HOGDescriptor hog;
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
/// Set up tracking vector
vector<Point> track;
while(true){
/// Grab a single frame from the video
cap >> current_frame;
/// Check if the frame has content
if(current_frame.empty()){
cerr << "Video has ended or bad frame was read. Quitting." << endl;
return 0;
}
/// 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).
///image, vector of rectangles, hit threshold, win stride, padding, scale, group th
Mat img = current_frame.clone();
resize(img,img,Size(img.cols*2, img.rows*2));
vector<Rect> found;
vector<double> weights;
hog.detectMultiScale(img, found, weights);
/// draw detections and store location
for( size_t i = 0; i < found.size(); i++ )
{
Rect r = found[i];
rectangle(img, found[i], cv::Scalar(0,0,255), 3);
stringstream temp;
temp << weights[i];
putText(img, temp.str(),Point(found[i].x,found[i].y+50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0,0,255));
track.push_back(Point(found[i].x+found[i].width/2,found[i].y+found[i].height/2));
}
/// plot the track so far
for(size_t i = 1; i < track.size(); i++){
line(img, track[i-1], track[i], Scalar(255,255,0), 2);
}
/// Show
imshow("detected person", img);
waitKey(1);
}
return 0;
}
```
2 | No.2 Revision |
You are lucky that I am currently teaching a class on this and just made a sample... but you will need to adapt it to your needs and make it more robust for your case
```
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
using namespace
}
```