opencv svm predict输出结果不对?

问题描述

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列的方式存进trainImg

float *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

opencv svm predict输出结果不对?的相关文章

c++-C语言 输出结果不对(统计三角形区域内多少棵树问题)

问题描述 C语言 输出结果不对(统计三角形区域内多少棵树问题) 果园里的数 xy坐标为1到99的整数,输入一个三角形的坐标 统计内部和边界有多少棵树 样例输入1.5 1.5 1.5 6.8 6.8 1.5 样例输出15 以下是通过有向面积编写的程序 哪里错了 为何输出30 #include double area2(double x0,double y0,double x1,double y1,double x2,double y2) { return x0*y1+x1*y2+x2*y0-x2*

图像加减运算,为什么输出结果不对

问题描述 图像加减运算,为什么输出结果不对 #include #include #include #include #include using namespace std; //图像加减运算 //unsigned char *lpSrc1:原图像1像素指针 //unsigned char *lpSrc2:原图像2像素指针 //unsigned char *lpDst:目标像素指针 int main() { IplImage * image1, *image2, *image3; image1

运行-这输出结果不对,怎么办?

问题描述 这输出结果不对,怎么办? #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; Node *createLink() { Node *head=(struct node*)malloc(sizeof(struct node)); Node *temp=head; int i=0; int a[10] = {1,2,3,5,7,9,10

为什么,输出的不对,我是照着书上写的,c语言

问题描述 为什么,输出的不对,我是照着书上写的,c语言 #include "stdio.h" #include "conio.h" int main() { int day,month,year,sum,leap; scanf("%d,%d,%d",&year,&month,&day); switch(month)//先计算某月以前月份的天数 { case 1: sum=0;break; case 2: sum=31;br

1到100产生随机数 并猜产生的随机数 如果猜对直接输出 猜不对继续猜问题

问题描述 希望大神们给指点一下谢谢! 解决方案 解决方案二:继续猜随机数要重新生成么?解决方案三:嗯是的给指点一下谢谢喽解决方案四:while(1==1){//产生一个随机数inta=随机数://输入的数intb=输入的数:if(a==b){//输出结果//终止循环break;}system.out.println("继续猜");}解决方案五:importjava.util.Scanner;publicclassGuess{publicstaticvoidmain(String[]ar

PHP4 的新函数介绍 - 输出信息控制函数 ,以前别人转发的

函数|控制 PHP4 的新函数介绍 - 输出信息控制函数   魔族精灵 这些函数可以让你控制你的脚本输出的内容.可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头新的情况. 输出控制函数不对使用 header() 或 setcookie() 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用. 例 1. 控制输出 <?php ob_start(); echo "Hello\n"; setcookie ("cookie

PHP4 的新函数介绍 - 输出信息控制函数

函数|控制 这些函数可以让你控制你的脚本输出的内容.可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头新的情况. 输出控制函数不对使用 header() 或 setcookie() 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用. 例 1. 控制输出 <?php ob_start(); echo "Hellon"; setcookie ("cookiename", "cookiedata&qu

利用PHP输出控制功能做简繁体转换

控制|转换 [摘 要] PHP 作为一种公开源代码的脚本语言,其扩充性是非常好的.本文只是对其一个功能的一种应用方式的探讨,并实现了比较完美的同一页面自动简繁体转换功能.希望广大爱好 PHP 的朋友能从中得到启发,做出更好的作品. 本文对PHP的输出控制功能进行了简单介绍并对其在简繁体转化中的应用给出了具体思路和实例. 一 PHP 输出控制功能介绍 PHP作为当今流行的脚本语言之一,具有编写简便,执行速度快,扩充性好等优点.PHP的输出信息控制函数可以让你控制你的脚本输出的内容,可以用于许多不同

PHP输出缓存ob系列函数详解

 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担 ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器. 下面我说说ob的基本作用:   1)防止在浏览器有输出之后再使用setcookie().header()或session_start()