关于 SVM predict函数报错问题

VS2019+OpenCV4.3.0

我做的是用SVM + 傅里叶算子识别静态手势的项目

在调试中,我发现第一次 predict函数 可以运行,第二次就会报如下错误:Assertion failed (samples.cols == var_count && samples.type() == CV_32F)

代码如下(错误):

for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 5; j++) {
			String str = loadimg_path + to_string(j) + "/" + to_string(i) + ".jpg";
			Mat src = imread(str);
			
			calcute_fft(src);	//计算傅里叶算子

			for (int i = 0; i < 15; i++){	
				ffsFeature.push_back(fd[i]);
			}

			Mat sample(1, ffsFeature.size(), CV_32FC1, ffsFeature.data());

				float r = psvm->predict(sample);//直接在 for循环中使用,只有第一次正常返回
												//第二次便会报异常错误
			

			r = abs(r - j) <= FLT_EPSILON ? 1.f : 0.f;

			prec_num += r;	//累计正确数
		}
	}
	cout << "识别率:" << (prec_num / templete_sum) * 100 << "%" << endl;

我想到或许是因为上次的循环结果对这次 predict 造成影响,但是不知道要清理哪个结果,函数是什么。

解决方法(正确代码)如下:
把预测部分封装成一个函数,在 for 循环中调用:float r = predictSVM();

for (int i = 0; i < templete_num; i++) {		//每一类的模板数
		for (int j = 1; j <= class_num; j++) {	//类别
//			if(i != 1 || j != 2)
//				continue;
			String str = loadimg_path + to_string(j) + "/" + to_string(i) + ".jpg";
			Mat src = imread(str);
			if (src.empty())
				cout << "not load image..." << endl;


			calcute_fft(src);
			
			float r = predictSVM();	//当函数调用时才没有报错
									//直接在 for 循环中使用 match_number = psvm->predict(sample);
									//一定会报错,具体原因不清楚

			r = abs(r - j) <= FLT_EPSILON ? 1.f : 0.f;
			prec_num += r;

		}
		cout << endl;
	}
	cout << "识别率:" << (prec_num / templete_sum) * 100 << "%" << endl;

更多关于这个错误,可以参考
保存xml文件后,再用以下的语句加载训练好的xml模型,predict出现了问题。

https://stackoverflow.com/questions/42347555/opencv-error-assertion-failed-samples-cols-var-count-samples-type-c

你可能感兴趣的:(open,CV,机器学习)