HOG+SVM实现行人检测

本文详细介绍了如何利用HOG特征和SVM分类器实现行人检测,重点是HOG特征在行人检测中的应用及其成功案例。文章提供了一份完整的实现代码,包括负样本裁剪函数,并给出了在Ubuntu14.04+opencv3.2环境下运行的注意事项,以及相关数据集和测试图片的来源。
摘要由CSDN通过智能技术生成

一、概述

  1. 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测;
  2. 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是
    Dalal和Triggs在2005年提出,并将其用于行人检测,
  3. 该方法在 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 - 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值