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中SVMOpenCV
- opencv + SVM 程式碼OpenCV
- opencv SVM的使用OpenCV
- OpenCV進階---介紹SVMOpenCV
- OpenCV中使用SVM簡介OpenCV
- 樸素貝葉斯/SVM文字分類文字分類
- 分類演算法-支援向量機 SVM演算法
- 用Python實現一個SVM分類器策略Python
- SVM分類器演算法總結&應用演算法
- Support Vector Machines(SVM)如何根據虹膜分類評估性格類別?Mac
- python ubuntu人臉識別 -1 SVM binary 分類器PythonUbuntu
- 【Svm機器學習篇】Opencv3.4.1與C++實現對分類問題的訓練與預測】機器學習OpenCVC++
- OpenCV筆記(3)實現支援向量機(SVM)OpenCV筆記
- 使用sklearn實現svm--用於機械故障分類
- python中的scikit-learn庫來實現SVM分類器。Python
- opencv python 基於SVM的手寫體識別OpenCVPython
- 基於Tensorflow + Opencv 實現CNN自定義影像分類OpenCVCNN
- 計算機視覺—人臉識別(Hog特徵+SVM分類器)(8)計算機視覺HOG特徵
- 【opencv3】 svm實現手寫體與人臉識別OpenCV
- OpenCV探索之路(二十八):Bag of Features(BoF)影像分類實踐OpenCV
- 訓練一個影像分類器demo in PyTorch【學習筆記】PyTorch筆記
- SVM實現多分類的三種方案
- 基於WOA-SVM的乳腺癌資料分類識別演算法matlab模擬,對比BP神經網路和SVM演算法Matlab神經網路
- 基於PSO-SVM的乳腺癌資料分類識別演算法matlab模擬,對比BP神經網路和SVM演算法Matlab神經網路
- 手把手教你使用LabVIEW OpenCV dnn實現影像分類(含原始碼)ViewOpenCVDNN原始碼
- 【火爐煉AI】機器學習014-用SVM構建非線性分類模型AI機器學習模型
- OpenCV(模板類 cv::Vec<T, cn>)OpenCV
- 【python資料探勘課程】二十七.基於SVM分類器的紅酒資料分析Python
- OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練OpenCV筆記
- SVM
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- 機器學習(3),opencv4.0中SVM各個引數的意義,設定機器學習OpenCV
- SVM原理
- 5 分鐘構建自己得 Facade demo
- 支援向量機(Support Vector Machine,SVM)—— 線性SVMMac
- ML.NET 示例:多類分類之問題分類
- ML.NET 示例:多類分類之鳶尾花分類
- 【數字影像處理6】python+opencv使用LBP、HOG提取特徵來分類人臉【更新中】PythonOpenCVHOG特徵