问题描述
- opencv svm predict输出结果不对?
-
请教各位大侠:
我在使用opencv3.0的SVM进行图像分类时,训练样本为图像的灰度值(float型,最小0,最大255,均值2.0),
当灰度大于3.0时,lables设为1.0,小于3.0时,设置为-1.0;随便选了一种核函数进行训练,
然后再拿原图作为测试样本,结果在“response = svm->predict(sampleMat);”结果怎么不是1或-1,而是很大的一个负数(-1082130432.000);对原图每个像素进行训练都是这个负数,请各位大侠赐教!!!十分感激!!!
主体代码如下:
Mat trainImg = Mat(width*height, 1, CV_32FC1, img_org);//把图像安装width*height行1列的方式存进trainImgfloat *labels = new float[width*height]; memset(labels, 0, sizeof(float)*width*height); for (int j = 0; j < height; j++){ for (int i = 0; i < width; i++){ if (img_org[j*width + i]>3.0) labels[j*width + i] = 1.0; else labels[j*width + i] = -1.0; } } Mat labelsMat = Mat(width*height, 1, CV_32SC1, labels); Ptr<ml::SVM> svm = ml::SVM::create(); svm->setType(ml::SVM::C_SVC); svm->setKernel(ml::SVM::LINEAR); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6));;//终止准则函数:当迭代次数达到最大值时终止 // 训练 svm->train(trainImg, ml::ROW_SAMPLE, labelsMat);// Mat image = Mat::zeros(width, height, CV_8UC3);// 之前一直弄成CV_32SC1格式了,呵呵 Vec3b green(0, 255, 0), blue(255, 0, 0); for (int j = 0; j < image.rows; j++){ for (int i = 0; i < image.cols; i++){ float temp = img_org[j*width + i]; Mat sampleMat = Mat(1, 1, CV_32FC1, temp); float response = 0; response = svm->predict(sampleMat);// ??? 结果怎么不是1或-1,而是很大的一个负数,用openCV行不通? if (abs(response-1.0)<0.0001) image.at<Vec3b>(j, i) = green; else if (abs(response + 1.0)<0.0001) image.at<Vec3b>(j, i) = blue; } } imwrite("result.png", image); delete[]img_org;
解决方案
http://blog.csdn.net/txdb/article/details/8112583
时间: 2024-09-28 21:27:36