`

opencv行人检测1(HOG+SVM)

阅读更多
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/objdetect.hpp>
#include<iostream>

using	namespace std;
using	namespace cv;

int	main(int argc, char **argv)
{
	Mat	img;
	//读取图片
	img = imread("D:\\b.png", 1);
	//HOG特征检测器
	HOGDescriptor	defaultHog;
	//设置SVM分类器
	defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
	//矩形框数组
	vector<Rect> found;
	//对图像进行多尺度检测
	defaultHog.detectMultiScale(img, found);
	//detectMultiScale(const Mat& image,CV_OUT vector<Rect>& objects,double scaleFactor = 1.1,int minNeighbors = 3,int flags = 0,Size minSize = Size(),Size maxSize = Size());
	//待检测图片,被检测物体的矩形框向量组,搜索窗口的比例系数	

	//画出矩形框
	for (int i = 0; i<found.size(); i++)
	{
		Rect r = found[i];	
		rectangle(img, r.tl(), r.br(), Scalar(0, 255, 0), 3);
	}

	//显示图片
	namedWindow("Detect pedestrain", WINDOW_AUTOSIZE);
	imshow("Detect pedestrain", img);
	waitKey(0);
	return	0;

}

 


       小编菜鸟一枚,第一次接触opencv,opencv还没学完,导师就让研究行人检测。

       在网上看到许多的大佬写的行人检测,大都是基于利用Hog进行特征提取和SVM分类器来进行行人检测,写的非常全,当然代码也就很复杂了。但小编这时完全不知道HOG和SVM是什么东西,opencv也没什么基础,C++也快忘完了。所以基本看不懂大神们写的长长的代码。

       所以小编挑了一个代码最少,看起来最简单的C++程序。研究了几个小时,终于发现,行人检测原来核心代码只有两句。

       第一句:defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());这是设置分类器SVM。

       第二句:defaultHog.detectMultiScale(img, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);这是进行多尺度检测,用HOG。

       所以小编写了段非常简单的代码,如上,就能实现简单的行人检测。

 

       这里,小编简单的说说代码每一句是什么意思。

       首先是vector。它是一个容器,能存放各种类型的对象。给大家举一个例子:

       vector<int> test;

       //建立一个vector,int为数组元素的数据类型,test为动态数组名(自己命名的)

       想深入了解vector的小白们,以下附上详细介绍vector的链接:

       https://blog.csdn.net/duan19920101/article/details/50617190/

     

       然后,HOGDescriptor是一个类,HOG被封装在这个类中。

       举个例子:

       HOGDescriptor  defaultHog ;

       这就定义了HOG对象defaultHog(自己命名的)。

     

       再给大家说说SVMDetector。

       实例:

       defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());

       就是调用setSVMDetector方法,给用于对HOG特征进行分类的SVM模型的系数赋值,这里的参数HOGDescriptor::getDefaultPeopleDetector()时,表示采用系统默认的参数。

 

       接着,opencv中使用detectMultiScale()来进行多尺度检测。

       defaultHog.detectMultiScale(img, found);

       img是输入的待检测的图片的名字,found是检测到目标区域列表,都是自己命名的。

       

       最后,rectangle函数,传入矩形参数来画矩形。

       rectangle(Mat& img,Rect rec,const Scalar&color,int thickness=1,int shift=0);

       实例:rectangle(img, Rect(100,300,20,200), Scalar(0, 0, 255), 1,1,0);

       其中rectangle(int a,int b, int c, int d),a,b为矩形左上角坐标,c,d为矩形的长和宽。

       scalar()表示颜色,后面的参数分别是线条粗细,线条类型,点类型。

        

       好,总结一下,行人检测代码初步完成,但还是会有许多的bug。看下图就知道它的矩形框多了。说明代码还需要完善。等小编再去研究研究。

 
         
 

 

       最后小编又参考了许多的文章,弄明白了行人检测的原理,对hogSVM进行了初步的研究。大概知道它是什么,主要干啥的。

 

       HOG是局部区域描述符,通过计算局部区域上的梯度方向直方图来构成人体特征。其实它就是用来采集人体特征的。

 

       SVM是支持向量机,就是一种判别方法。小编看了一个故事,然后发现,SVM就是一条线,它可以把两个类别无错误的分隔开。

 

       而行人检测原理,就是先用HOG采集出人体特征,再用SVM分类器分出行人和非行人。

 

       根据小编的理解,就是用HOG采集出行人和非行人的特征,再根据特征的不同用SVM把行人和非行人分开。最后再画出矩形框把行人圈出来就行了。

 

       小编还看到,许多的文章都说到了样本训练。这个代码用的是默认的参数,是opencv自带的。没有自己训练样本,所以代码很简单。

        样本训练,小编还要再研究研究。还有HOG算子和SVM向量机的原理,小编也是一知半解,等小编去研究研究,先记着,以后再说。

 

 

 

  • 大小: 495 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics