OpenCV中基于HOG特征的行人检测
目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图)。HOG特征是用于目标检测的特征描述子,它通过计算和统计图像局部区域的梯度方向直方图来构成特征,用这些特征描述原始图像。
HOG的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域(称为cells),每个cell生成一个方向梯度直方图或者cell中pixel的边缘方向,这些直方图的组合可表示出(所检测目标的目标)描述子。
为改善准确率,局部直方图可以通过计算图像中一个较大区域(称为block)的光强作为measure被对比标准化,然后用这个值(measure)归一化这个block中的所有cells.这个归一化过程完成了更好的照射/阴影不变性。与其他描述子相比,HOG得到的描述子保持了几何和光学转化不变性(除非物体方向改变)。因此HOG描述子尤其适合人的检测。
OpenCV实现了两种类型的基于HOG特征的行人检测,分别是SVM和Cascade,下边这个小程序是这两种分类器的简单使用。OpenCV自带的级联分类器的文件的位置在“XX\opencv\sources\data\hogcascades”
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include <Windows.h>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("E:\\Picture\\person01.jpg",1);
vector<Rect> personSVM, personCasc,personListSVM, personListCacs;//检测结果矩形框向量
DWORD SVMTimeBegin,SVMTimeEnd,CascTimeBegin,CascTimeEnd; //耗时统计
//方法1,Hog+svm
SVMTimeBegin = GetTickCount();
HOGDescriptor hog;//HOG特征检测器
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//设置SVM分类器为默认参数
hog.detectMultiScale(src, personSVM, 0, Size(2,2), Size(0,0), 1.05, 2);//对图像进行多尺度检测
SVMTimeEnd=GetTickCount();
cout<<"HOG+SVM行人检测耗时:\n"<<(SVMTimeEnd-SVMTimeBegin)<<endl;
//方法2.Hog+cascade
CascTimeBegin=GetTickCount();
CascadeClassifier *cascade = new CascadeClassifier;
cascade->load("D:\\ProgramFilesD\\opencv\\sources\\data\\hogcascades\\hogcascade_pedestrians.xml");
cascade->detectMultiScale(src, personCasc);
CascTimeEnd=GetTickCount();
cout<<"HOG+Cascade行人检测耗时:\n"<<(CascTimeEnd-CascTimeBegin)<<endl;
//不重合的直接放入List,重合的选取最外侧结果
for(int i=0; i < personSVM.size(); i++)
{
Rect r = personSVM[i];
int j=0;
for(; j < personSVM.size(); j++)
if(j != i && (r & personSVM[j]) == r)
break;
if( j == personSVM.size())
personListSVM.push_back(r);
}
for(int i=0; i < personCasc.size(); i++)
{
Rect r = personCasc[i];
int j=0;
for(; j < personCasc.size(); j++)
if(j != i && (r & personCasc[j]) == r)
break;
if( j == personCasc.size())
personListCacs.push_back(r);
}
//画矩形框,缩放检测到的矩形框
for(int i=0; i<personListSVM.size(); i++)
{
Rect r = personListSVM[i];
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(src, r.tl(), r.br(), Scalar(0,0,255), 2);
}
for(int i=0; i<personListCacs.size(); i++)
{
Rect r = personListCacs[i];
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(src, r.tl(), r.br(), Scalar(0,255,0), 2);
}
imshow("HOG特征+SVM/Cascade行人检测",src);
waitKey();
return 0;
}
SVM和Cascade的检测结果分别用红色和蓝色矩形框标注,检测结果:
OpenCV中基于HOG特征的行人检测的更多相关文章
- opencv+树莓PI的基于HOG特征的行人检测
树莓PI远程控制摄像头请参考前文:http://www.cnblogs.com/yuliyang/p/3561209.html 参考:http://answers.opencv.org/questio ...
- OpenCV中基于Haar特征和级联分类器的人脸检测
使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
- 基于Haar特征Adaboost人脸检测级联分类
基于Haar特征Adaboost人脸检测级联分类 基于Haar特征Adaboost人脸检测级联分类,称haar分类器. 通过这个算法的名字,我们能够看到这个算法事实上包括了几个关键点:Haar特征.A ...
- 利用HOG+SVM实现行人检测
利用HOG+SVM实现行人检测 很久以前做的行人检测,现在稍加温习,上传记录一下. 首先解析视频,提取视频的每一帧形成图片存到磁盘.代码如下 import os import cv2 videos_s ...
- 基于HOG特征的Adaboost行人检测
原地址:http://blog.csdn.net/van_ruin/article/details/9166591 .方向梯度直方图(Histogramof Oriented Gradient, HO ...
- Hog SVM 车辆 行人检测
HOG SVM 车辆检测 近期需要对卡口车辆的车脸进行检测,首先选用一个常规的检测方法即是hog特征与SVM,Hog特征是由dalal在2005年提出的用于道路中行人检测的方法,并且取的了不错的识别效 ...
- [OpenCV-Python] OpenCV 中计算摄影学 部分 IX 对象检测 部分 X
部分 IX计算摄影学 OpenCV-Python 中文教程(搬运)目录 49 图像去噪目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoisi ...
- 基于虚拟数据的行人检测研究(Expecting the Unexpected: Training Detectors for Unusual Pedestrians with Adversarial Imposters)
Paper Link : https://arxiv.org/pdf/1703.06283 Github: https://github.com/huangshiyu13/RPNplus 摘要: 这篇 ...
随机推荐
- 用FATFS在SD卡里写一串数字
用FATFS写SD卡,如写入数组 s[] ={1,2,3,4,5,6} 想要在txt中显示“123456” 就要把 s[0]=1+'0' 或 s[0]=1+48 或 s[0]=1+0x30 ...
- 一个例子讲解wav头文件 stm32声音程序 录音和播放 wav
下面我们一wav头文件来分析一下: 下面是双声道的,16位,48000采样录的wav文件: 打开属性,能看到的有用信息只有比特率了: 上图的比特率就是 wav头文件里的bitrate: 1536kbp ...
- error C2220: warning treated as error - no 'object' file generated warning C4819: The file contains a character that cannot be represented in the current code page (936).
用Visual Studio2015 编译时,遇到如下编译错误: error C2220: warning treated as error - no 'object' file generated ...
- 数据类型总结——Number(数值类型)
相关文章 简书原文:https://www.jianshu.com/p/9fb573ef10da 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...
- window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang 分类: C1_HTML/JS/JQUERY 2014-08-06 16:47 558人阅读 评论(0) 收藏
部分内容参考:http://www.aspbc.com/tech/showtech.asp?id=1256 在开发的过程中,经常使用window.onload和body onload两种,很少使用do ...
- css3-8 内外边距中的注意要点有哪些
css3-8 内外边距中的注意要点有哪些 一.总结 一句话总结:padding,border都是外延的.margin会合并. 1.两元素样式都有margin:15px,他们中间的距离是15px还是30 ...
- 指针知识梳理6-const与指针
const 定义的变量为仅仅读变量.在语法层面上通过这个变量去改动内存是不同意的. 可是对于下面代码.就有非常多人绕了: const int *p1; //p1能变.*p1不能变 int cons ...
- Spring之i18n配置与使用
Spring的i18n配置: <!-- conf:i18n --> <bean id="messageSource" class="org.spring ...
- ### Hibernate中的事务与并发 ###
**事务相关的概念** 1. 什么是事务 * 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全都成功,要么全都失败. * 转账的例子:冠希给美美转钱,扣钱,加钱.两个操作组成了一个事情! ...
- .netcore consul实现服务注册与发现-集群完整版
原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...