opencv SVM分類Demo
train.cpp:
#define _CRT_SECURE_NO_WARNINGS
#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 getFiles(string path, vector<string>& files);
void get_1(Mat& trainingImages, vector<int>& trainingLabels);
void get_0(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訓練器引數
CvSVMParams SVM_params;
SVM_params.svm_type = CvSVM::C_SVC;
SVM_params.kernel_type = CvSVM::LINEAR;
SVM_params.degree = 0;
SVM_params.gamma = 1;
SVM_params.coef0 = 0;
SVM_params.C = 1;
SVM_params.nu = 0;
SVM_params.p = 0;
SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
//訓練
CvSVM svm;
svm.train(trainingData, classes, Mat(), Mat(), SVM_params);
//儲存模型
svm.save("svm.xml");
cout << "訓練好了!!!" << endl;
getchar();
return 0;
}
void getFiles(string path, vector<string>& files)
{
long hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
void get_1(Mat& trainingImages, vector<int>& trainingLabels)
{
char * filePath = "data\\train_image\\1";
vector<string> files;
getFiles(filePath, files);
int number = files.size();
for (int i = 0; i < number; i++)
{
Mat SrcImage = imread(files[i].c_str());
resize(SrcImage, SrcImage, cv::Size(60, 256), (0, 0), (0, 0), cv::INTER_LINEAR); //將圖片調整為相同的大小
SrcImage = SrcImage.reshape(1, 1);
trainingImages.push_back(SrcImage);
trainingLabels.push_back(1);
}
}
void get_0(Mat& trainingImages, vector<int>& trainingLabels)
{
char * filePath = "data\\train_image\\0";
vector<string> files;
getFiles(filePath, files);
int number = files.size();
for (int i = 0; i < number; i++)
{
Mat SrcImage = imread(files[i].c_str());
resize(SrcImage, SrcImage, cv::Size(60, 256), (0, 0), (0, 0), cv::INTER_LINEAR); //將圖片調整為相同的大小
SrcImage = SrcImage.reshape(1, 1);
trainingImages.push_back(SrcImage);
trainingLabels.push_back(0);
}
}
由於我的資料集不是同樣大小的,所以在reshape前進行resize操作。
test.cpp:
#define _CRT_SECURE_NO_WARNINGS
#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>
#include<iomanip>
using namespace std;
using namespace cv;
void getFiles(string path, vector<string>& files);
int main()
{
int result = 0;
char * filePath = "data\\test_image\\0";
vector<string> files;
getFiles(filePath, files);
int number = files.size();
cout << "圖片個數:"<<number << endl;
CvSVM svm;
svm.clear();
string modelpath = "svm.xml";
if (modelpath.length() == 0)
{
cout << "匯入模型錯誤" << endl;
return 0;
}
FileStorage svm_fs(modelpath, FileStorage::READ);
if (svm_fs.isOpened())
{
svm.load(modelpath.c_str());
}
for (int i = 0; i < number; i++)
{
Mat inMat = imread(files[i].c_str());
resize(inMat, inMat, cv::Size(60, 256), (0, 0), (0, 0), cv::INTER_LINEAR); //將圖片調整為相同的大小
Mat p = inMat.reshape(1, 1);
p.convertTo(p, CV_32FC1);
int response = (int)svm.predict(p);
if (response == 0)
{
result++;
}
}
cout << "識別個數:"<<result << endl;
cout << "識別率:" <<setprecision(2)<<fixed<< double(result) / (double)(number) << endl;
getchar();
return 0;
}
void getFiles(string path, vector<string>& files)
{
long hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
在進行預測時,predict中的圖片大小需要和train中的圖片大小保持一致。否則會報錯。
程式碼已上傳
參考自https://blog.csdn.net/chaipp0607/article/details/68067098
相關文章
- opencv svm分類OpenCV
- opencv中的SVM影像分類(二)OpenCV
- opencv中的SVM影像分類(一)OpenCV
- 學習SVM(一) SVM模型訓練與分類的OpenCV實現模型OpenCV
- opencv中SVMOpenCV
- OpenCV 與 SVMOpenCV
- opencv SVM 使用OpenCV
- opencv SVM的使用OpenCV
- opencv + SVM 程式碼OpenCV
- OpenCV的SVM用法OpenCV
- 學習OpenCV——SVMOpenCV
- opencv中svm原始碼OpenCV原始碼
- SVM多分類器的實現(Opencv3,C++)OpenCVC++
- Opencv中SVM樣本訓練、歸類流程及實現OpenCV
- OpenCV進階---介紹SVMOpenCV
- OpenCV中使用SVM簡介OpenCV
- 分類演算法-支援向量機 SVM演算法
- 樸素貝葉斯/SVM文字分類文字分類
- 『sklearn學習』不同的 SVM 分類器
- Spark MLlib SVM 文字分類器實現Spark文字分類
- 【Svm機器學習篇】Opencv3.4.1與C++實現對分類問題的訓練與預測】機器學習OpenCVC++
- OPENCV SVM介紹和自帶例子OpenCV
- Opencv 用SVM訓練檢測器OpenCV
- OpenCV中的SVM引數優化OpenCV優化
- SVM分類器演算法總結&應用演算法
- Support Vector Machines(SVM)如何根據虹膜分類評估性格類別?Mac
- 用Python實現一個SVM分類器策略Python
- svm 多分類機制
- 使用sklearn實現svm--用於機械故障分類
- 利用Hog特徵和SVM分類器進行行人檢測HOG特徵
- 自己訓練SVM分類器進行HOG行人檢測HOG
- OpenCV筆記(3)實現支援向量機(SVM)OpenCV筆記
- 學習Opencv2.4.9(四)---SVM支援向量機OpenCV
- python ubuntu人臉識別 -1 SVM binary 分類器PythonUbuntu
- OpenCV訓練自己的衣服探測分類器OpenCV
- opencv python 基於SVM的手寫體識別OpenCVPython
- 計算機視覺—人臉識別(Hog特徵+SVM分類器)(8)計算機視覺HOG特徵
- 我的OpenCV學習筆記(六):使用支援向量機(SVM)OpenCV筆記