opencv训练SVM手写体识别

数据下载:https://download.csdn.net/download/qq_34510308/11049610
代码如下

#include <stdio.h>  
#include <time.h>  
#include <opencv2/opencv.hpp>  
#include <opencv/cv.h>  
#include <iostream> 
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/ml/ml.hpp>  
#include <io.h>

using namespace std;
using namespace cv;

void getAllFiles(string path, vector<string>& files);
void get_1(Mat& trainingImages, vector<int>& trainingLabels);
void get_0(Mat& trainingImages, vector<int>& trainingLabels);
//void get_g(Mat& trainingImages, vector<int>& trainingLabels);

int main()
{
	//获取训练数据
	Mat classes;
	Mat trainingData;
	Mat trainingImages;
	vector<int> trainingLabels;
	get_1(trainingImages, trainingLabels);
	get_0(trainingImages, trainingLabels);
	Mat(trainingImages).copyTo(trainingData);
	trainingData.convertTo(trainingData, CV_32FC1);
	Mat(trainingLabels).copyTo(classes);

	//配置SVM训练器参数
	cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
	svm->setType(cv::ml::SVM::C_SVC);
	svm->setKernel(cv::ml::SVM::LINEAR);
	//svm->setDegree(0);
	svm->setGamma(0.01);
	svm->setC(10.0);
	//svm->setCoef0(0);
	//svm->setNu(0);
	//svm->setP(0);
	svm->setTermCriteria(cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01));
	//训练
	svm->train(trainingData, cv::ml::SampleTypes::ROW_SAMPLE, classes);

	//保存模型
	svm->save("svm.xml");
	cout << "训练好了!!!" << endl;

	//预测图像
	Mat sample = imread("D:/data/1/100.jpg");
	sample = sample.reshape(1, 1);
	sample.convertTo(sample, CV_32FC1);
	Ptr<cv::ml::SVM> svm1 = cv::ml::SVM::StatModel::load<cv::ml::SVM>("svm.xml");
	float res = svm1->predict(sample); 
	cout << res << endl;
	getchar();
	return 0;
}
//遍历文件夹 2019-03-13
void getAllFiles(string path, vector<string>& files)
{
	//文件句柄  
	__int64 hFile = 0;
	//文件信息  
	struct __finddata64_t  fileinfo;  //很少用的文件信息读取结构
	string p;  //string类很有意思的一个赋值函数:assign(),有很多重载版本
	if ((hFile = _findfirst64(p.assign(path).append("/*.jpg").c_str(), &fileinfo)) == -1)
	{
		cout << "No file is found\n" << endl;
	}
	else
	{
		do
		{
			files.push_back(p.assign(path).append("/").append(fileinfo.name));
		} while (_findnext64(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}
}
void get_1(Mat& trainingImages, vector<int>& trainingLabels)
{
	const char * filePath = "D:\\data\\1";
	vector<string> files;
	getAllFiles(filePath, files);
	int number = files.size();
	for (int i = 0; i < number; i++)
	{
		//cout << files[i] << endl;
		Mat  SrcImage = imread(files[i].c_str());
		SrcImage = SrcImage.reshape(1, 1);
		trainingImages.push_back(SrcImage);
		trainingLabels.push_back(1);
	}
}
void get_0(Mat& trainingImages, vector<int>& trainingLabels)
{
	const char * filePath = "D:\\data\\0";
	vector<string> files;
	getAllFiles(filePath, files);
	int number = files.size();
	for (int i = 0; i < number; i++)
	{
		Mat  SrcImage = imread(files[i].c_str());
		SrcImage = SrcImage.reshape(1, 1);
		trainingImages.push_back(SrcImage);
		trainingLabels.push_back(0);
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python-OpenCV训练SVM,您需要遵循以下步骤: 1. 收集并准备数据集:您需要准备正样本和负样本的图像。将它们分别放在两个文件夹中,并确保它们的命名方式相同。 2. 提取图像特征:使用OpenCV的HOG描述符提取每个图像的特征。将这些特征存储在一个numpy数组中。 3. 创建SVM训练器:使用OpenCV的ml库创建一个SVM训练器对象。 4. 训练SVM:调用SVM训练器的train方法,并将特征数组和标签数组作为参数传递。标签数组应该是一个大小相同的numpy数组,其中包含正样本和负样本的标签。 5. 测试SVM:使用一些测试数据来测试SVM的性能,可以使用OpenCV的predict方法。预测结果将是一个数,其中1表示正类,0表示负类。 以下是一个简单的示例代码,用于训练SVM: ```python import cv2 import numpy as np # Step 1: Collect and prepare dataset pos_images = ["pos1.jpg", "pos2.jpg", ...] neg_images = ["neg1.jpg", "neg2.jpg", ...] # Step 2: Extract image features hog = cv2.HOGDescriptor() features = [] labels = [] for img in pos_images: img = cv2.imread(img) features.append(hog.compute(img)) labels.append(1) for img in neg_images: img = cv2.imread(img) features.append(hog.compute(img)) labels.append(0) features = np.squeeze(features) labels = np.array(labels) # Step 3: Create SVM trainer svm = cv2.ml.SVM_create() # Step 4: Train SVM svm.train(features, cv2.ml.ROW_SAMPLE, labels) # Step 5: Test SVM test_img = cv2.imread("test.jpg") test_features = hog.compute(test_img) result = svm.predict(test_features) print(result) ``` 请注意,此代码仅为示例,您可能需要根据自己的数据集和需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值