HOG特征SVM识别字符

算法思想介绍请自行百度学习。

训练函数:

#include "opencv\cv.h"
#include "opencv\highgui.h"
#include "opencv2\opencv.hpp"
#include <string>
#include <vector>

using namespace std;
using namespace cv;

//SVM训练
void svmHogTrain()
{
	int i, j;
	int testCount = 1016, testType = 10, featureLen = 324;
	char buffer[100];

	Mat src;
	Mat data = Mat::zeros(testCount * testType, featureLen, CV_32FC1);
	Mat res = Mat::zeros(testCount * testType, 1, CV_32SC1);

	for (i = 0; i < testType; i++)
	{
		for (j = 1; j < testCount; j++)
		{
			sprintf_s(buffer, "C:/Users/admin/Desktop/Industry check/EnglishFnt/English/Fnt_3/Sample%03d/%05d.png", i+1, j);
			//sprintf_s(buffer, "C:/Users/admin/Desktop/Industry check/dataset/train_n/%05d/%05d.png", i, j);
			//sprintf_s(buffer, "C:/Users/admin/Desktop/Industry check/EnglishFnt/English/Fnt_3/Sample%03d/%05d.png", i+11, j);
			//sprintf_s(buffer, "C:/Users/admin/Desktop/Industry check/dataset/train_1_n/%05d/%05d.jpg", i, j);

			src = imread(buffer, CV_LOAD_IMAGE_GRAYSCALE);

			threshold(src, src, 0, 255, CV_THRESH_OTSU);
			
			HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 64), cvSize(32, 32), cvSize(16, 16), cvSize(16, 16), 9);
			vector<float>descriptors;//结果数组       
			hog->compute(src, descriptors, Size(1, 1), Size(0, 0)); //调用计算函数开始计算       

			int n = 0;
			for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
			{
				data.at<float>(i * testCount + j - 1, n) = *iter;
				n++;
			}

			res.at<int>(i * testCount + j - 1, 0) = i;
		}
		cout << i << "  " << "completed" << endl;
	}
	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));

	svm->train(data, cv::ml::SampleTypes::ROW_SAMPLE, res);

	svm->save("SVM_HOG_DATA.xml");
}

预测函数:

#include "opencv\cv.h"
#include "opencv\highgui.h"
#include "opencv2\opencv.hpp"
#include <string>
#include <vector>

using namespace std;
using namespace cv;

//SVM预测
int svmHogPredict(Mat SrcImg)
{
	cv::Ptr<cv::ml::SVM> svm;

	svm = cv::ml::SVM::load<cv::ml::SVM>("SVM_HOG_DATA.xml");

	HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 64), cvSize(32, 32), cvSize(16, 16), cvSize(16, 16), 9);
	vector<float>descriptors;//结果数组       
	hog->compute(SrcImg, descriptors, Size(1, 1), Size(0, 0)); //调用计算函数开始计算
	Mat SVMtrainMat = Mat::zeros(1, descriptors.size(), CV_32FC1);
	int n = 0;
	for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
	{
		SVMtrainMat.at<float>(0, n) = *iter;//把HOG存储下来    
		n++;
	}
	int ret = svm->predict(SVMtrainMat);//检测结果
	return ret;
}

识别函数:

程序简单自行编写,先调用训练函数,再调用识别函数。
注意:保证待识别图片大小与上述函数中要求一致。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonhog SVM字符识别是一种使用Python编程语言实现的基于hog特征和支持向量机(SVM)算法的单字符识别方法。 HOG(Histogram of Oriented Gradients)是一种图像特征提取算法,通过计算图像中不同方向的梯度直方图来描述图像的局部结构特征。在字符识别中,通过提取字符图像的HOG特征,可以将字符的轮廓和边缘等重要特征量化表示。 SVM是一种监督学习算法,通过将样本映射到高维特征空间,找到一个最优的超平面来将不同类别的样本分开。在单字符识别中,SVM可以通过训练一系列具有不同类别标签的字符图像样本,学习分类边界,从而实现对未知字符识别。 使用Python实现单字符识别时,可以借助开源机器学习库如scikit-learn和opencv等。首先,需要构建一个训练集和测试集,包含多种不同的字符图像样本。然后,将每个字符图像样本转换为HOG特征向量,并将其与对应字符的标签进行关联。接着,使用训练集进行SVM模型的训练,并通过交叉验证等方法选择最优的模型参数。最后,使用测试集评估模型的性能以及准确率。 Pythonhog SVM字符识别方法具有较高的准确率和鲁棒性,适用于各种场景的单字符识别任务。但需要注意的是,这种方法对图像质量、光照条件等环境因素较为敏感,因此在实际应用中需要进行相应的预处理和参数调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值