OpenCV:Adaboost训练时数据扩增
生活随笔
收集整理的這篇文章主要介紹了
OpenCV:Adaboost训练时数据扩增
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????? 更準確的模型需要更多的數據,對于傳統非神經網絡機器學習方法,不同的特征需要有各自相符合的數據擴增方法。
1.?? 在使用opencv_traincascade.exe 過程中,圖像讀取在
???????? classifier.train ->? updateTrainingSet( requiredLeafFARate, tempLeafFARate )->fillPassedSamples( 0, numPos, true, 0, posConsumed )->imgReader.getPos( img ) :? imgReader.getNeg( img )過程中。
2. 在進行數據增強的過程中,從createSample開始,保證vecFile和樣本數目長度一致。
修改代碼段依次為:
//int cvCreateTrainingSamplesFromInfoRf(const char* infoname, const char* vecfilename, int cvCreateSamplesPlus(const char* infoname, const char* vecfilename,?int num,int showsamples,int winwidth, int winheight) {CvEnhanseData????? enhanser;char fullname[PATH_MAX];char* filename;FILE* info;FILE* vec;//IplImage* src = 0;//IplImage* sample;cv::Mat src, sample;int line;int error;int i;int x, y, width, height;int total;assert(infoname != NULL);assert(vecfilename != NULL);total = 0;if (!icvMkDir(vecfilename)){#if CV_VERBOSEfprintf(stderr, "Unable to create directory hierarchy: %s\n", vecfilename); #endif /* CV_VERBOSE */return total;}info = fopen(infoname, "r");if (info == NULL){#if CV_VERBOSEfprintf(stderr, "Unable to open file: %s\n", infoname); #endif /* CV_VERBOSE */return total;}vec = fopen(vecfilename, "wb");if (vec == NULL){#if CV_VERBOSEfprintf(stderr, "Unable to open file: %s\n", vecfilename); #endif /* CV_VERBOSE */fclose(info);return total;}//sample = cvCreateImage(cvSize(winwidth, winheight), IPL_DEPTH_8U, 1);icvWriteVecHeader(vec, num, winwidth, winheight);if (showsamples){cvNamedWindow("Sample", CV_WINDOW_AUTOSIZE);}strcpy(fullname, infoname);filename = strrchr(fullname, '\\');if (filename == NULL){filename = strrchr(fullname, '/');}if (filename == NULL){filename = fullname;}else{filename++;}for (line = 1, error = 0, total = 0; total < num; line++){int count;error = (fscanf(info, "%s %d", filename, &count) != 2);if (!error){//src = cvLoadImage(fullname, 0);//error = (src == NULL);src = cv::imread(fullname, 0);error = (src.data == NULL);if (error){#if CV_VERBOSEfprintf(stderr, "Unable to open image: %s\n", fullname); #endif /* CV_VERBOSE */}}for (i = 0; (i < count) && (total < num); i++, total++){error = (fscanf(info, "%d %d %d %d", &x, &y, &width, &height) != 4);if (error) break;//cvSetImageROI(src, cvRect(x, y, width, height));//cvResize(src, sample, width >= sample->width &&height >= sample->height ? CV_INTER_AREA : CV_INTER_LINEAR);cv::resize(src, sample, cv::Size(winwidth,winheight));//if (showsamples)//{//?? ?cvShowImage("Sample", sample);//?? ?if (cvWaitKey(0) == 27)//?? ?{//?? ??? ?showsamples = 0;//?? ?}//}//icvWriteVecSample(vec, sample);{int extNum = 7;//IplImage* sample2 = cvCreateImage(cvGetSize(sample), IPL_DEPTH_8U, sample->nChannels);//cvCopyImage(sample, sample2);std::vector<cv::Mat > imgLIst(extNum);cv::Mat inMat(sample);//此句導致占用釋放錯誤enhanser.EnhanceData(inMat, extNum, 1, imgLIst);for (int i = 0; i < extNum; ++i){//把Mat 生成移除來//已不必要//IplImage* sampleT = nullptr;// = nullptr;//*sampleT = IplImage(imgLIst[i]);//icvWriteVecSample(vec, sampleT);icvWriteVecSamplePlus(vec,imgLIst[i]);//if (sampleT)//{//?? ?cvReleaseImage(&sampleT);//}}}}//if (src)//{//?? ?cvReleaseImage(&src);//}if (error){#if CV_VERBOSEfprintf(stderr, "%s(%d) : parse error", infoname, line); #endif /* CV_VERBOSE */break;}}//if (sample)//{//?? ?cvReleaseImage(&sample);//}fclose(vec);fclose(info);return total; }修改函數:void icvWriteVecSample //對每個圖像寫入正樣本Vec void icvWriteVecSamplePlus(FILE* file, cv::Mat &sample) {//CvMat* mat, stub;int r, c;short tmp;uchar chartmp;//mat = cvGetMat(sample, &stub);chartmp = 0;fwrite(&chartmp, sizeof(chartmp), 1, file);for (r = 0; r < sample.rows; r++){for (c = 0; c < sample.cols; c++){//tmp = (short)(CV_MAT_ELEM(*mat, uchar, r, c));tmp = (short)(sample.at<unsigned char>(r,c));fwrite(&tmp, sizeof(tmp), 1, file);}} }
使用C++語言替換掉使用C語言的版本。
同時對生成新的Vec增加int extNum = 7;倍。
總結
以上是生活随笔為你收集整理的OpenCV:Adaboost训练时数据扩增的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固定收益类产品有哪些
- 下一篇: OpenCV: OpenCV人脸检测框可