opencv_haartraining.exe 训练数据集自己经历过的坑

来源:互联网 发布:网站编辑seo是什么 编辑:程序博客网 时间:2024/05/18 03:38

1、opencv_haartraining.exe 在新版本里面没有,之前在openv3.3.1 和 3.1.0 中都没找打,看网上用的是2.4.9 ,然后才用 opencv249完成。

2、将图片名称输入到 txt 文件,最开始直接进入样本图片的文件夹,直接 dir /b > pos.txt ,这样 pos.txt 文件名也会刷到该 txt 文件中,而且在执行opencv_haartraining.exe 过程中,负样本的 txt 文件必须和opencv_haartraining.exe 在同一路径下,使用

dir /b/s/p/w *.jpg > 路径.txt,这样对于替换 txt 里面的内容更方便。

3、没做正样本数据归一化,然后就会在某个地方一直循环下去,像如下图这组数据,第一项 n 会一直增加,但是后面的值,一直不会被改变。

对于这个问题,在做了归一化,和正样本大小归一化后,解决。

以下代码是对正样本集做归一化大小和灰度图处理,然后保存为新图片:

#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/ml/ml.hpp"#include <iostream>#include <stdio.h>#include <direct.h>#include <fstream> using namespace std;using namespace cv;typedef enum{NEG = 0,POS,}TYPE;int main(int argc, char **argv){Mat image, ori;MatsmallImg(20, 20, CV_8UC1);//将图片缩小,加快检测速度char *name = NULL;char *grayname = NULL;int insert = 0;int nameindex = 0;TYPE type;if (atoi(argv[1]) == 1){type = POS;}else if (atoi(argv[1]) == 0){type = NEG;}else{cout << "input type err, please input a num: 0 or 1..." << endl;int num;scanf("%d", &num);type = (TYPE)num;}grayname = (char *)malloc(20);if (grayname == NULL){cout << "malloc grayname fail! " << endl;return -1;}name = (char *)malloc(20);if (name == NULL){cout << "malloc name fail! " << endl;return -1;}cout << argv[1] << endl;char *txt;if (type == POS)txt = "positive\\pos.txt";elsetxt = "negative\\neg.txt";ifstream file(txt, ios::in | ios::binary | ios::ate);long size = file.tellg();cout << "size = " << size << endl;file.seekg(0, ios::beg);while (1){file.read((name + insert), 1);//cout << name[insert] << endl;if (name[insert] == NULL)break;else if (insert > 0 && name[insert] == '\n'){memset(name+insert-1, NULL, 2);cout << "name = " << name << endl;image = imread(name, 1);if (!image.empty())//读取图片数据不能为空{if (type == POS){sprintf(grayname, "GrayPos\\grayimg_%d.jpg", nameindex);}else{sprintf(grayname, "GrayNeg\\grayimg_%d.jpg", nameindex);}cout << grayname << endl;cvtColor(image, ori, COLOR_BGR2GRAY);cvtColor(image, ori, CV_BGR2GRAY);//因为用的是类haar特征,所以都是基于灰度图像的,这里要转换成灰度图像resize(ori, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);//将尺寸缩小到1/scale,用线性插值equalizeHist(smallImg, smallImg);//直方图均衡imwrite(grayname, smallImg);nameindex++;//cv::destroyWindow("result");}memset(name, 0, 20);insert = 0;continue;}insert++;}file.close();free(name);free(grayname);cout << "Done,please input a key to exit..." << endl;getchar();return 0;}


训练命令
dir /b/s/p/w *.jpg > ..\neg.txt
opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 20 -h 20
opencv_haartraining.exe -data data\data -vec pos.vec -bg neg.txt -nstages 20 -nsplits 1 -npos 400 -nneg 1200 -mode all -w 20 -h 20

原创粉丝点击