加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

测试 svm 训练的xml 分类器 ~

发布时间:2020-12-16 00:28:23 所属栏目:百科 来源:网络整理
导读:用 svm 训练了个分类器。 给图片分类的。 目标 : 1 else : 0 载入分类器查看效果 [cpp] view plain copy #include"stdafx.h" #include"cv.h" #include"highgui.h" #includeml.h #includeiostream #includefstream #includestring #includevector using nam
用 svm 训练了个分类器。

给图片分类的。

目标 : 1

else : 0


载入分类器查看效果



[cpp] view plain copy
  1. #include"stdafx.h"
  2. #include"cv.h"
  3. #include"highgui.h"
  4. #include<ml.h>
  5. #include<iostream>
  6. #include<fstream>
  7. #include<string>
  8. #include<vector>
  9. usingnamespacecv;
  10. namespacestd;
  11. intmain(intargc,char**argv)
  12. {
  13. CvSVMsvm=CvSVM();//新建一个SVM
  14. svm.load("SVM_DATA.xml",0);
  15. //if(svm==NULL)
  16. //{
  17. //printf("Cantloadurxml!n");
  18. //}
  19. CvCapture*video=cvCaptureFromAVI("D:videos.avi");
  20. IplImage*test=NULL;//从视频中抓取的一帧
  21. IplImage*trainImg=cvCreateImage(cvSize(64,64),8,3);//itssizemust=img'ssizewhichusedtotrainurxml
  22. ofstreampredict_txt("SVM_PREDICT.txt");//把预测结果存储在这个文本中
  23. intcnt=0;//用来标记第几帧
  24. cvNamedWindow("video");
  25. while(1)
  26. {
  27. test=cvQueryFrame(video);
  28. if(test==NULL)
  29. break;
  30. }
  31. else
  32. charline[512];
  33. cvZero(trainImg);
  34. cvResize(test,trainImg);//读取图片
  35. HOGDescriptor*hog=newHOGDescriptor(cvSize(64,cvSize(16,16),cvSize(8,8),9);//具体意思见参考文章1,2
  36. vector<float>descriptors;//结果数组
  37. hog->compute(trainImg,descriptors,Size(1,1),Size(0,0));//调用计算函数开始计算
  38. cout<<"HOGdims:"<<descriptors.size()<<endl;
  39. CvMat*SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
  40. intn=0;
  41. for(vector<float>::iteratoriter=descriptors.begin();iter!=descriptors.end();iter++)
  42. cvmSet(SVMtrainMat,n,*iter);
  43. n++;
  44. intret=svm.predict(SVMtrainMat);//获取最终检测结果,这个predict的用法见OpenCV的文档
  45. std::sprintf(line,"Frame:%drn",ret);
  46. predict_txt<<line;
  47. if(ret==1)
  48. CvFontfont;//定义字体结构体
  49. cvInitFont(&font,1.0,2,8);//初始化字体结构体
  50. char*warn="Target!!!";
  51. cvPutText(test,sun,cvPoint(10,10),&font,CV_RGB(255,0); background-color:inherit">//在窗口中显示warning的红色提示信息
  52. cvShowImage("video",test);
  53. cvWaitKey(20);
  54. }
  55. cvReleaseImage(&trainImg);
  56. predict_txt.close();
  57. system("PAUSE");
  58. return0;
  59. }



测试某个 目录 下的图片:


copy
    svm.load("F:testSVM_DATA.xml",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> cout<<"loadxml"<<endl;
  1. stringbuf;
  2. IplImage*test;
  3. vector<string>img_tst_path;
  4. ifstreamimg_tst("F:testtest.txt");//同输入训练样本,这里也是一样的,只不过不需要标注图片属于哪一类了
  5. while(img_tst)
  6. if(getline(img_tst,buf))
  7. img_tst_path.push_back(buf);
  8. img_tst.close();
  9. //需要分析的图片,这里默认设定图片是64*64大小,所以上面定义了1764,如果要更改图片大小,可以先用debug查看一下descriptors是多少,然后设定好再运行
  10. CvMat*test_hog=cvCreateMat(1,1764,CV_32FC1);//注意这里的1764,同上面一样
  11. charline[512];
  12. ofstreampredict_txt("F:testSVM_PREDICT.txt");for(string::size_typej=0;j!=img_tst_path.size();j++)//依次遍历所有的待检测图片
  13. test=cvLoadImage(img_tst_path[j].c_str(),1);
  14. cout<<"cannotloadtheimage:"<<img_tst_path[j].c_str()<<endl;
  15. continue;
  16. cvZero(trainImg);
  17. cvResize(test,0); background-color:inherit">//读取图片
  18. HOGDescriptor*hog=
  19. vector<//结果数组
  20. hog->compute(trainImg,0); background-color:inherit">//调用计算函数开始计算
  21. cout<<"HOGdims:"<<descriptors.size()<<endl;
  22. CvMat*SVMtrainMat=cvCreateMat(1,CV_32FC1);
  23. n=0;
  24. float>::iteratoriter=descriptors.begin();iter!=descriptors.end();iter++)
  25. cvmSet(SVMtrainMat,*iter);
  26. n++;
  27. //获取最终检测结果,这个predict的用法见OpenCV的文档
  28. std::sprintf(line,"%s%drn",img_tst_path[j].c_str(),ret);
  29. predict_txt<<line;
  30. predict_txt.close();
  31. cvReleaseImage(&trainImg);
  32. system("PAUSE");
  33. return0;
  34. }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读