JS技术

正式使用opencv里的训练和检测 - opencv_createsamples、opencv_traincascade(2)

字号+ 作者:H5之家 来源:H5之家 2015-12-15 08:44 我要评论( )

这是程序识别到的参数,没有错把,如果你哪个字母打错了,你就会发现这些参数会跟你预设的不一样啊,所以大家一定要看清楚了~~~~ 跑啊跑啊跑啊跑,如下: 这一级的强训练器达到你预设的比例以后就跑去训练下一级了


这是程序识别到的参数,没有错把,如果你哪个字母打错了,你就会发现这些参数会跟你预设的不一样啊,所以大家一定要看清楚了~~~~

跑啊跑啊跑啊跑,如下:


这一级的强训练器达到你预设的比例以后就跑去训练下一级了,同志们那个HR比例不要设置太高,不然会需要好多样本,然后stagenum不要设置太小啊,不然到时候拿去检测速度会很慢。

等这个bat跑结束,我的xml文件也生成了。如下:


其实这个训练可以中途停止的,因为下次开启时它会读取这些xml文件,接着进行上次未完成的训练。哈哈~~~~好人性化啊!

训练结束,我要到了我的cascade.xml文件,现在我要拿它去做检测了啊!呼呼~~~~


五、开始检测吧

opencv有个opencv_performance.exe程序用于检测,但是它只能用在用opencv_haartraining.exe来用的,所以我这里是针对一些列图片进行检测的,检测代码如下:

#include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <stdlib.h> #include "wininet.h" #include <direct.h> #include <string.h> #include <list> #pragma comment(lib,"Wininet.lib") #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> using namespace std; using namespace cv; String cascadeName = "./cascade.xml";//训练数据 struct PathElem{ TCHAR SrcImgPath[MAX_PATH*2]; TCHAR RstImgPath[MAX_PATH*2]; }; int FindImgs(char * pSrcImgPath, char * pRstImgPath, std::list<PathElem> &ImgList); int main( ) { CascadeClassifier cascade;//创建级联分类器对象 std::list<PathElem> ImgList; std::list<PathElem>::iterator pImgListTemp; vector<Rect> rects; vector<Rect>::const_iterator pRect; double scale = 1.; Mat image; double t; if( !cascade.load( cascadeName ) )//从指定的文件目录中加载级联分类器 { cerr << "ERROR: Could not load classifier cascade" << endl; return 0; } int nFlag = FindImgs("H:/SrcPic/","H:/RstPic/", ImgList); if(nFlag != 0) { cout<<"Read Image error ! Input 0 to exit \n"; exit(0); } pImgListTemp = ImgList.begin(); for(int iik = 1; iik <= ImgList.size(); iik++,pImgListTemp++) { image = imread(pImgListTemp->SrcImgPath); if( !image.empty() )//读取图片数据不能为空 { Mat gray, smallImg( cvRound (image.rows/scale), cvRound(image.cols/scale), CV_8UC1 );//将图片缩小,加快检测速度 cvtColor( image, gray, CV_BGR2GRAY );//因为用的是类haar特征,所以都是基于灰度图像的,这里要转换成灰度图像 resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//将尺寸缩小到1/scale,用线性插值 equalizeHist( smallImg, smallImg );//直方图均衡 //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,rects表示检测到的目标序列,1.1表示 //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大 //小都可以检测到目标),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的 //最小最大尺寸 rects.clear(); printf( "begin...\n"); t = (double)cvGetTickCount();//用来计算算法执行时间 cascade.detectMultiScale(smallImg,rects,1.1,2,0,Size(20,20),Size(30,30)); //|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE, t = (double)cvGetTickCount() - t; printf( "detection time = %g ms\n\n", t/((double)cvGetTickFrequency()*1000.) ); for(pRect = rects.begin(); pRect != rects.end(); pRect++) { rectangle(image,cvPoint(pRect->x,pRect->y),cvPoint(pRect->x+pRect->width,pRect->y+pRect->height),cvScalar(0,255,0)); } imwrite(pImgListTemp->RstImgPath,image); } } return 0; } int FindImgs(char * pSrcImgPath, char * pRstImgPath, std::list<PathElem> &ImgList) { //源图片存在的目录 TCHAR szFileT1[MAX_PATH*2]; lstrcpy(szFileT1,TEXT(pSrcImgPath)); lstrcat(szFileT1, TEXT("*.*")); //结果图片存放的目录 TCHAR RstAddr[MAX_PATH*2]; lstrcpy(RstAddr,TEXT(pRstImgPath)); _mkdir(RstAddr); //创建文件夹 WIN32_FIND_DATA wfd; HANDLE hFind = FindFirstFile(szFileT1, &wfd); PathElem stPathElemTemp; if(hFind != INVALID_HANDLE_VALUE) { do { if(wfd.cFileName[0] == TEXT('.')) continue; if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY || strcmp("Thumbs.db", TEXT(wfd.cFileName)) == 0) { ; } else { TCHAR SrcImgPath[MAX_PATH*2]; lstrcpy(SrcImgPath, pSrcImgPath); lstrcat(SrcImgPath, TEXT(wfd.cFileName)); lstrcpy(stPathElemTemp.SrcImgPath, SrcImgPath); TCHAR AdressTemp[MAX_PATH*2]; lstrcpy(AdressTemp,pRstImgPath); //lstrcat(AdressTemp, TEXT("/")); lstrcat(AdressTemp, TEXT(wfd.cFileName)); lstrcpy(stPathElemTemp.RstImgPath, AdressTemp); ImgList.push_back(stPathElemTemp); } }while(FindNextFile(hFind, &wfd)); } else { return -1; } return 0; }

自己看看自己的检测结果咯。效果不好的改进样本,调整训练参数吧~~~嘎嘎


我觉得我写的够白痴,很方便大家直接拿来用。其中一些细节,大家自己琢磨吧~88



附:

1、opencv_createsamples.exe的参数

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • AngularJS使用HTML5摄像头拍照

    AngularJS使用HTML5摄像头拍照

    2016-02-23 09:42

  • 从Container内存监控限制到CPU使用率限制方案 - 走在前往架构师的路上 - 博客频道 - CSDN.NET 走

    从Container内存监控限制到CPU使用率限制方案 - 走在前往架构师的路

    2015-12-15 09:09

  • 数据抽取工具Kettle使用 - 唐僧打怪兽 - 博客频道 - CSDN.NET 唐僧打怪兽 热爱互联网,编程,比如:J

    数据抽取工具Kettle使用 - 唐僧打怪兽 - 博客频道 - CSDN.NET 唐僧打

    2015-12-14 15:37

  • Oracle数据库Decode()函数的使用方法 - 周泽辉的CSDN博客... - 博客频道 - CSDN.NET 周

    Oracle数据库Decode()函数的使用方法 - 周泽辉的CSDN博客... - 博客

    2015-12-14 15:05

网友点评