【OpenCV3】HOG+SVM目标识别

本文介绍了如何使用OpenCV3结合HOG特征描述子和SVM进行目标识别,主要涵盖SVM+HOG的训练和检测过程。通过OpenCV库,该方法广泛应用于行人、汽车等对象的识别。
摘要由CSDN通过智能技术生成

SVM,即支持向量机,在结合相关特征描述子之后,在目标识别,如行人识别、汽车识别、人脸识别等领域中有着重要应用。opencv中提供了HOG特征描述子,这种特征提供支持SVM的接口。这不再进行原理性的介绍,直接介绍如何使用opencv进行SVM+HOG训练和检测。

 

1、svm+hog训练

 

#include <iostream>  
#include <fstream>  
#include <opencv2/opencv.hpp>
#include <string>

#define PosSamNO 3000    //正样本个数  
#define NegSamNO 3000    //负样本个数  
#define HardExampleNO 1000   //难例个数


void train_svm_hog()
{
	//HOG检测器,用来计算HOG描述子的
	//检测窗口(48,48),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 
	cv::HOGDescriptor hog(cv::Size(48, 48), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9);  
	int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定  

	//设置SVM参数
	cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
	svm->setType(cv::ml::SVM::Types::C_SVC);
	svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);
	svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));

	std::string ImgName;

	//正样本图片的文件列表
	std::ifstream finPos("positive_samples.txt");
	//负样本图片的文件列表
	std::ifstream finNeg("negative_samples.txt");

	//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数 
	cv::Mat sampleFeatureMat;
	//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有目标,-1表示无目标 
	cv::Mat sampleLabelMat;


	//依次读取正样本图片,生成HOG描述子  
	for (int num = 0; num < PosSamNO && getline(finPos, ImgName); num++)
	{
		std::cout << "Processing:" << ImgName << std::endl; 
		cv::Mat image = cv::imread(ImgName);  

		//HOG描述子向量 
		std::vector<float> descriptors;
		//计算HOG描述子,检测窗口移动步长(8,8)
		hog.compute(image, descriptors, cv::Size(8, 8));  

		//处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量
  • 18
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 204
    评论
评论 204
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值