做行人检测时用SVM训练模型,读取文件时老是出现错误

半导体行业的小白 2018-01-04 07:02:42
#include <opencv.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace cv;
using namespace cv::ml;
using namespace std;
#define CENTRAL_CROP true
#define NUMPOS 2416//正样本
#define NUMNEG 12180//负样本
#define NUMHARD 0//负样本个数
int main()
{
int DescriptorDim;
string ImgName;
ifstream pos("POS.txt");
ifstream neg("NEG.txt");
Mat sampleFeatureMat;
Mat sampleabelMat;
for (int num = 0; num < NUMPOS&&getline(pos, ImgName); num++)
{
cout << "处理:" << ImgName << endl;
Mat src = imread(ImgName);
if (CENTRAL_CROP)
{
src = src(Rect(16, 16, 64, 128));
}
HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 128), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
vector<float>descriptor;
hog->compute(src, descriptor, Size(8, 8));
if (0 == num)
{
DescriptorDim = descriptor.size();
sampleFeatureMat = Mat::zeros(NUMPOS + NUMNEG + NUMHARD, DescriptorDim, CV_32SC1);
sampleabelMat = Mat::zeros(NUMPOS + NUMNEG + NUMHARD, 1, CV_32SC1);
}
for (int i = 0; i < DescriptorDim; i++)
{
sampleFeatureMat.at<float>(num, i) = descriptor[i];
sampleabelMat.at<float>(num, 0) = 1;
}
}
for (int num = 0; num < NUMNEG&&getline(neg, ImgName); num++)
{
cout << "处理:" << ImgName << endl;
Mat src = imread(ImgName);
HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 128), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
vector<float>descriptor;
hog->compute(src, descriptor, Size(8, 8));
for (int i = 0; i < DescriptorDim; i++)
{
sampleFeatureMat.at<float>(num + NUMNEG, i) = descriptor[i];
sampleabelMat.at<float>(num + NUMNEG, 0) = -1;
}
}
ofstream fout("SampleFeatureMat.txt");
for(int i=0; i<NUMPOS+NUMNEG;i++)
{
fout<<i<<endl;
for(int j=0; j<DescriptorDim; j++)
fout<<sampleFeatureMat.at<float>(i,j)<<" ";
fout<<endl;
}
cout << "Starting training process" << endl;
Ptr<SVM> svm = SVM::create();
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
svm->setType(SVM::Types::C_SVC);
svm->setKernel(SVM::KernelTypes::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1E-6));
Ptr<TrainData> tData = TrainData::create(sampleFeatureMat, ROW_SAMPLE, sampleabelMat);
svm->train(tData);
cout << "训练完成" << endl;
svm->save("E:\\视觉检测\\SVM.xml");
system("pause");
}
...全文
349 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2018-01-05
  • 打赏
  • 举报
回复
引用 4 楼 weixin_40365447 的回复:
@jianwen0529 确实发生的是您描述的错误,请是什么原因呢?
这个不清楚,在调用堆栈要一层层看,估算出可能出错的原因,再排查。你代码量不多,应该比较容易找到原因 原因必定是因为你给接口的某些数据不合乎它使用要求
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
我是c++的初学者老师您这说的方法我尝试了,都看的不是很懂。
  • 打赏
  • 举报
回复
@jianwen0529 确实发生的是您描述的错误,请是什么原因呢?
  • 打赏
  • 举报
回复
是的,刚调出来看就是这个位置出现错误,请问您知道什么原因吗?
赵4老师 2018-01-05
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
赵4老师 2018-01-05
  • 打赏
  • 举报
回复
引用 5 楼 weixin_40365447 的回复:
引用 2 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
我是c++的初学者老师您这说的方法我尝试了,都看的不是很懂。
QQ:511606848 收费帮解决。
幻夢之葉 2018-01-04
  • 打赏
  • 举报
回复
菜单-调试-窗口中打开调用堆栈窗口,找到最近引发中断的你的代码,检查哪里不符合程序的要求 估计是i0 < size.p[0]这里断言失败

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧