1 批量读取一个文件夹中的所有照片

1、当文件中的图片命名有一定规则时:

for (int i = 1; i < 100; i++)   //100{stringstream ss;string str;ss << i;   // 将int输入流中ss >> str; // 将ss中的数值输出到str中string fileName = "E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\has\\train\\plate_" + str + ".jpg";files.push_back(fileName);Mat srcImage = imread(fileName);imshow("srcImage",srcImage);image.push_back(srcImage);labels.push_back(1);}

2、使用OpenCV的glob函数:

 fileName = "E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\no\\train\\*.jpg";glob(fileName,nofiles,false);for (int i = 0; i < nofiles.size(); i++) {Mat src = imread(nofiles[i]);image.push_back(src);labels.push_back(0);}

通过使用glob可以将pattern路径下的所用文件名存进result中.

void cv::glob ( String pattern, std::vector< String > & result, bool recursive = false
)

2 完整过程:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<string>
#include<opencv2\ml\ml.hpp>using namespace cv;
using namespace std;void convert_to_ml(const vector< Mat > & train_samples, Mat& trainData)
{//--Convert dataconst int rows = (int)train_samples.size();const int cols = (int)train_samples[0].cols*train_samples[0].rows;trainData = Mat(rows, cols, CV_32FC1);//一定要类型转换32FC1for (int i = 0; i < train_samples.size(); ++i){Mat p = train_samples[i].reshape(1, 1);//一行向量p.copyTo(trainData.row(i));//trainData.row(i)返回Mat类型}
}
int main() {string file;vector<string> files;vector<String> nofiles,testnofiles;vector<Mat> image, testimage;vector<int> labels;string fileName; Mat srcImage,dst;for (int i = 1; i < 601; i++)   //600{stringstream ss;string str;ss << 1;ss >> str;fileName = "E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\has\\train\\plate_" + str + ".jpg";files.push_back(fileName);srcImage = imread(fileName);cvtColor(srcImage, dst, CV_RGB2GRAY);resize(dst, dst, Size(120, 30)); //30*120image.push_back(dst);labels.push_back(1);}fileName = "E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\no\\train\\*.jpg";glob(fileName,nofiles,false);for (int i = 0; i < 600; i++) {//nofiles.size()Mat src = imread(nofiles[i]);cvtColor(src, dst, CV_RGB2GRAY);//36*136resize(dst,dst,Size(120,30)); //30*120image.push_back(dst); labels.push_back(0);}Mat traindata,testdata;convert_to_ml(image, traindata);Mat label = cv::Mat(labels);Ptr<ml::SVM> svm = ml::SVM::create();svm->setCoef0(0.0);svm->setKernel(ml::SVM::LINEAR);//RBFsvm->setType(ml::SVM::C_SVC);svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));svm->train(traindata, 0, label);cout << "train final" << endl;Mat supportvector=svm->getSupportVectors();//test////单个样本预测Mat sample = traindata.row(3);float repon=svm->predict(sample);//多个样本预测Mat classa;Mat row = traindata.rowRange(1, 50).clone();svm->predict(row, classa);vector<float> re;for (int i = 0; i < 49; i++) {float a = classa.at<float>(i, 0);re.push_back(a);   //证明我们的预测器是可以正常工作的,只是追确率堪忧!!}//单个测试样本Mat src = imread("E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\has\\train\\plate_36.jpg");cvtColor(src, dst, CV_RGB2GRAY);//36*136resize(dst, dst, Size(120, 30));Mat s = dst.reshape(1, 1);s.convertTo(s, CV_32FC1);float r = svm->predict(s);//多个测试样本预测fileName = "E:\\test_opencv\\EasyPR-master\\resources\\train\\svm\\has\\test\\*.jpg";glob(fileName, testnofiles, false);for (int i = 0; i < 100; i++) {//nofiles.size()Mat src = imread(testnofiles[i]);cvtColor(src, dst, CV_RGB2GRAY);//36*136resize(dst, dst, Size(120, 30)); //30*120testimage.push_back(dst);}convert_to_ml(testimage, testdata);Mat class1;svm->predict(testdata, class1);vector<float> reponse;for (int i = 0; i < 100; i++) {float a = class1.at<float>(i, 0);reponse.push_back(a);}waitKey(0);}

有几点注意:

1、svm->train(traindata, 0, label);

原型:svm->train(trainingDataMat, cv::ml::ROW_SAMPLE, labelsMat));

traindata必须是  Mat(rows, cols, CV_32FC1)类型,label可以是Mat,也可以是vector<int>.类型转换很简单:Mat label = cv::Mat(labels);

2、svm->predict(row, classa);既可以预测一个样本,也可以同时预测多个样本,预测多个样本时,row是一个n行的Mat。

3、reshape函数既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,

函数原型:   C++: Mat Mat::reshape(int cn, int rows=0) const

  1. cn: 表示通道数(channels), 如果设为0,则表示保持通道数不变,否则则变为设置的通道数。
  2. rows: 表示矩阵行数。 如果设为0,则表示保持原有的行数不变,否则则变为设置的行数

OpenCV训练SVM模型并预测的完整过程相关推荐

  1. opencv C++ SVM模型训练与分类实现

    最近想学习一下分类算法的内容,恰好opencv有SVM的函数,故先从这个下手.找了许多资料,发现要么是opencv2.3的,要么就没有具体实现代码,学习还是把代码与原理一起结合来看比较好. 其中,我主 ...

  2. 机器学习实战5-sklearn训练SVM模型分类回归(make_moons数据集)

    先上公式推导吓吓萌新...嘻嘻 上图中两个决策边界(虚线)的间隔为,可以把它看做求两条平行直线的距离,只是这里是超直线罢了, 例如:两平行线方程分别是:Ax+By+C1=0和Ax+By+C2=0 则它 ...

  3. 基于Django构建在线文本分类预测系统:SVM模型在线预测与部署 基于 Django 3.2 框架

    文章大纲 算法端与后端环境搭建 前端构建 Ajax XHR 创建网页与 Django项目 创建网页 前端 -- django 项目创建与启动 前端 -- 创建 django app 应用 postma ...

  4. python应用(3)svm模型预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

  5. 带你了解3类预训练语音模型预测方法

    摘要:在调研多篇论文后,笔者发现预训练语音模型的预测方法基本可以分为以下3类:<1>用前文预测当前及后文(自回归)<2> 随机mask 一些帧并预测 <3> 用两侧 ...

  6. 车牌识别EasyPR(3)——SVM模型判断车牌

    本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是SVM(支持向量机). 我们已经知道,车牌定位模块的输出是一些候选车牌的图片.但如 ...

  7. keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...

    你能通过"优雅的单宁香"."成熟的黑醋栗香气"或"浓郁的酒香"这样的描述,预测葡萄酒的价格吗?事实证明,机器学习模型可以. 在这篇文章中,我 ...

  8. 天池竞赛——工业蒸汽量预测(完整代码分享)

    @[By 爱吃肉的小吃货] 给自己定个小目标,榜上有名.从刚开始的1263到目前的395,小目标达成. 目录 一.赛题描述 赛事链接:https://tianchi.aliyun.com/compet ...

  9. CMU预训练模型最新综述:自然语言处理新范式—预训练、Prompt和预测

    ©PaperWeekly 原创 · 作者 | 王馨月 学校 | 四川大学本科生 研究方向 | 自然语言处理 概要 本文针对自然语言处理的新范式--我们称之为"prompt-based 学习& ...

最新文章

  1. Asp.net 导入Excel(服务器不带Office)
  2. python 递归乘法
  3. python websocket server_用Python实现一个简单的WebSocket服务器
  4. 三年程序猿的实战开发经验之谈-做人做事建议
  5. w3 protocol
  6. 许可证( License LicenseLicenseLicenseLicenseLicense)服务器配置
  7. 云服务器怎么管理,第一次使用云服务器,如何使用和管理云服务器
  8. 避免内存泄漏 - C++快速入门38
  9. 夺命雷公狗---PDO NO:3与连接有关的选项
  10. * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法
  11. cocos2d-js 开发常用方法
  12. VBA实战技巧精粹之按某列相同数据分入同一个sheet
  13. 匹配非零开头的最多带两位小数的数字正则表达式
  14. 找寻比QQ和新浪UC更先进的视频聊天软件
  15. 2022: LAVT: Language-Aware Vision Transformer for Referring Image Segmentation
  16. winvnc源码阅读笔记(四)---------vncDesktopThread线程
  17. MPAndroidChart3使用详解4:BarChart(柱形图)
  18. 低功耗蓝牙搜索广播的实现流流程介绍 /BLE scan flow ----- 蓝牙低功耗协议栈
  19. 关于机器学习与人类学习不同点的思考
  20. ABR CQP CRF码率控制总结

热门文章

  1. linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
  2. vue 引入html模板,vue单页面用script方式引入 使用模板时报错。 - 社区 - 妙味课堂...
  3. Xpath延伸以及总结
  4. Linux更改文件及目录权限问题
  5. 洛谷 P1031 均分纸牌【交叉模拟】
  6. Windows启动管理器
  7. 《机器学习实战》程序清单3-4 创建树的函数代码
  8. Windows下Python3+nose+appium自动化测试之Android篇
  9. ubuntu高版本环境变量问题
  10. java接口的作用是什么?