一、概述
- 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测;
- 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是
Dalal和Triggs在2005年提出,并将其用于行人检测,- 该方法在 MIT行人数据库上获得近乎 100% 的检测成功率;在包含视角、 光照和背景等变化的 INRIA 行人数据库上,也取得了大约 90% 的检测成功率。HOG是目前使用最为广泛的行人特征描述子。
参考博客:
二、实现代码
先上完整的代码,再进行解析说明
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include <sys/time.h>
using namespace std;
using namespace cv;
using namespace cv::ml;
#define PosSamNO 2416 //original positive num
#define NegSamNO 6070 // original negative num
#define cropNegNum 1214 //number of to be croped picture
#define HardExampleNO 0 // hard negative num
#define AugPosSamNO 0 //Aug positive num
#define TRAIN true //if TRAIN is true, it will Train the data, if false it will not
#define CENTRAL_CROP true // it is nessary to set it to true,to fit the hog parameter
#define crop_negsample false //if true,it will crop the negtive sample at random
/********************************* 随机剪裁负样本 *******************************************/
void crop_negsample_random()
{
string imgName;
char saveName[200];
ifstream fileNeg("../img_dir/sample_neg.txt");
int num=0;
//如果文件存在,则先删除该文件
ofstream fout("../img_dir/sample_new_neg.txt",ios::trunc);
//读取负样本
for (int i = 0;i < cropNegNum && getline(fileNeg, imgName); i++)
{
imgName = "../normalized_images/train/neg/" + imgName; //加路径
Mat img = imread(imgName, IMREAD_UNCHANGED);
struct timeval tv;
if (img.empty())
{
cout << "can not load the image:" << imgName << endl;
continue;
}
if (img.cols >= 64 && img.rows >= 128)
{
num = 0;
//从每张图片中随机剪裁5张64*128的负样本
for (int j = 0;j < 5;j++)
{
gettimeofday(&tv,NULL);
srand(tv.tv_usec);//利用系统时间(微妙),设置随机数种子
int x = rand() % (img.cols - 64); //左上角x
int y = rand() % (img.rows -