用 svm 训练了个分类器。
目标 : 1
else : 0
- #include"stdafx.h"
- #include"cv.h"
- #include"highgui.h"
- #include<ml.h>
- #include<iostream>
- #include<fstream>
- #include<string>
- #include<vector>
- usingnamespacecv;
- namespacestd;
- intmain(intargc,char**argv)
- {
- CvSVMsvm=CvSVM();//新建一个SVM
- svm.load("SVM_DATA.xml",0);
- //if(svm==NULL)
- //{
- //printf("Cantloadurxml!\n");
- //}
- CvCapture*video=cvCaptureFromAVI("D:\\video\\s.avi");
- IplImage*test=NULL;//从视频中抓取的一帧
- IplImage*trainImg=cvCreateImage(cvSize(64,64),8,3);//itssizemust=img'ssizewhichusedtotrainurxml
- ofstreampredict_txt("SVM_PREDICT.txt");//把预测结果存储在这个文本中
- intcnt=0;//用来标记第几帧
- cvNamedWindow("video");
- while(1)
- {
- test=cvQueryFrame(video);
- if(test==NULL)
- break;
- }
- else
- charline[512];
- cvZero(trainImg);
- cvResize(test,trainImg);//读取图片
- HOGDescriptor*hog=newHOGDescriptor(cvSize(64,cvSize(16,16),cvSize(8,8),9);//具体意思见参考文章1,2
- vector<float>descriptors;//结果数组
- hog->compute(trainImg,descriptors,Size(1,1),Size(0,0));//调用计算函数开始计算
- cout<<"HOGdims:"<<descriptors.size()<<endl;
- CvMat*SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
- intn=0;
- for(vector<float>::iteratoriter=descriptors.begin();iter!=descriptors.end();iter++)
- cvmSet(SVMtrainMat,n,*iter);
- n++;
- intret=svm.predict(SVMtrainMat);//获取最终检测结果,这个predict的用法见OpenCV的文档
- std::sprintf(line,"Frame:%d\r\n",ret);
- predict_txt<<line;
- if(ret==1)
- CvFontfont;//定义字体结构体
- cvInitFont(&font,1.0,2,8);//初始化字体结构体
- char*warn="Target!!!";
- cvPutText(test,sun,cvPoint(10,10),&font,CV_RGB(255,0);background-color:inherit;">//在窗口中显示warning的红色提示信息
- cvShowImage("video",test);
- cvWaitKey(20);
- }
- cvReleaseImage(&trainImg);
- predict_txt.close();
- system("PAUSE");
- return0;
- }
测试某个 目录 下的图片:
@H_404_488@ svm.load("F:\\test\\SVM_DATA.xml",108);list-style:outside;color:inherit;line-height:18px;"> cout<<"loadxml"<<endl;