cv svm-OpenCV中CV_SVM中单类如何实现代码?

问题描述

OpenCV中CV_SVM中单类如何实现代码?

我现在想利用CV_SVM中的ONE_CLASS进行单类分类方法,但是又不知道该怎么样使用函数以及具体参数的设置。
以下是我参照多类别分类的代码,但是运行时报错,希望懂得人给点指导。

#include "stdafx.h"
#include
#include
#include
#include
#include

using namespace std;

int main(int arg,char **argv)
{
const int s=1000;
int size= 400;
int i,j,svm_num;

IplImage *img;
img = cvCreateImage(cvSize(size,size),IPL_DEPTH_8U,3);

cvZero(img);

CvSVM svm = CvSVM();
CvSVMParams param;
CvTermCriteria criteria;

CvRNG rng = cvRNG(time(NULL));
CvPoint pts[s];
float data[s*2];

float space[s*2];
int res[s];

CvMat data_mat,res_mat;
CvScalar rcolor;
const float *support;

int n=0;
for (i=0; i<s; i++)
{
    pts[i].x = cvRandInt(&rng) %size;
    pts[i].y = cvRandInt(&rng) %size;
    if ((pts[i].y > 50 && pts[i].y < 100) && (pts[i].x >50 &&pts[i].x<100)) //根据指定位置设定想要的范围,这些也是仅有的正样本。
    {
        cvLine(img, cvPoint(pts[i].x - 2,pts[i].y-2), cvPoint(pts[i].x+2,pts[i].y+2),CV_RGB(255,0,0));
        cvLine (img, cvPoint (pts[i].x + 2, pts[i].y - 2), cvPoint (pts[i].x - 2, pts[i].y + 2), CV_RGB (255, 0, 0));
        res[n] =1; //记录样本
        space[n*2] = float(pts[i].x)/size;
        space[n*2 +1] = float(pts[i].y)/size;
        n++;
    }
    else
    {
        cvLine(img, cvPoint(pts[i].x - 2,pts[i].y-2), cvPoint(pts[i].x+2,pts[i].y+2),CV_RGB(0,255,0));
        cvLine (img, cvPoint (pts[i].x + 2, pts[i].y - 2), cvPoint (pts[i].x - 2, pts[i].y + 2), CV_RGB (0,255, 0));
    }

}

cvNamedWindow("SVM",CV_WINDOW_AUTOSIZE);
cvShowImage("SVM",img);
cvWaitKey(0);

float *data1 = new float[n*2];
int *res1 = new int[n];
for(i=0; i<n; i++)
{
   data1[i*2] = space[i*2];
   data1[i*2+1] =space[i*2+1];
   res1[i] = res[i];
}

/* for (i=0; i<s; i++)
{
data[i 2] = float(pts[i].x) /size ;
data[i*2 + 1] = float(pts[i].y)/size;
}
/

cvInitMatHeader(&data_mat, s , 2 ,CV_32FC1, data1);
cvInitMatHeader(&res_mat, s , 1,CV_32SC1 , res1);

criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);

//参数设置ONE_CLASS
param = CvSVMParams(CvSVM::ONE_CLASS, CvSVM::RBF, 10.0 , 8.0 , 1.0, 10.0, 0.5, 0.1,NULL,criteria);
//这个地方有错,不知道是参数问题 还是用法问题?
//对样本进行训练
svm.train(&data_mat,&res_mat,NULL,NULL,param);

svm_num  = svm.get_support_vector_count();
for (i=0; i<svm_num; i++)
{
    support = svm.get_support_vector(i);
    cvCircle (img, cvPoint ((int) (support[0] * size), (int) (support[1] * size)), 5, CV_RGB (200, 200, 200));
}
cvNamedWindow ("SVM", CV_WINDOW_AUTOSIZE);
cvShowImage ("SVM", img);
cvWaitKey (0);
return 1;

}

解决方案

opencv不是开源的么,你把源代码搞出来看看
或者参考一下啊这个
http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html

时间: 2024-10-06 06:16:26

cv svm-OpenCV中CV_SVM中单类如何实现代码?的相关文章

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改.      Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria).      其中probImage为输入图像直方图的反向投影

opencv中的kmeans函数

问题描述 opencv中的kmeans函数 LBPimage是一个3通道的灰度图像.通过kmeans函数之后,分的两类,labels的各个分量都是0,只有第一个和最后一个元素是1.请问大神们,错在哪里. Mat LBPimage=LBP(imgs); int nl = LBPimage.rows; int nc = LBPimage.cols; Mat points; points.create(nc*nl, 1, CV_32FC1); int n = 0; for (int i = 0; i

在opencv中利用findContours进行轮廓检测,程序运行结束时为什么会报中断错误,求解?

问题描述 在opencv中利用findContours进行轮廓检测,程序运行结束时为什么会报中断错误,求解? 代码如下: #include #include #include #include #include #include using namespace cv; using namespace std; //一.将源图片转成单通道的灰阶图片 Mat changeSourceImg(Mat img){ Mat great(img.size(), CV_8U); cvtColor(img, g

计算方差-请教大神在opencv中怎么计算图像局部方差

问题描述 请教大神在opencv中怎么计算图像局部方差 请教大神在opencv中怎么计算图像局部方差, 请教大神在opencv中怎么计算图像局部方差, 请教大神在opencv中怎么计算图像局部方差,谢谢 解决方案 你也在学opencv吗,可以交流下 解决方案二: 局部,是正常的矩形还是不规则区域 矩形: 坐标的x y即像素点的x y根据长宽遍历 不规则: 我暂时没有计算过 你图像是灰阶还是RGB 如果灰阶 按照灰阶度使用公式即可,如果是RGB建议先用cvmerxx 函数忘记了 把RGB通道合成之

opencv中的一段代码,希望有人可以解释下

问题描述 opencv中的一段代码,希望有人可以解释下 5C 还非得输入长度30-10000的问题描述.....................................................opencv中的一段代码,希望有人可以解释下.就是从垂直投影开始的代码处 没有看懂,好几个循环, 希望大牛可以帮忙解释下,刚接触OPENCV不久.难道代码没有 传上来 吗 解决方案 ```#include <cv.h>#include <cxcore.h>#include &l

opencv-为何OpenCV中cvWaitKey(1)延时不是1ms?

问题描述 为何OpenCV中cvWaitKey(1)延时不是1ms? 我写了一个三帧差分法进行运动目标检测的程序,通过 start = GetTickCount(); if(cvWaitKey(1)>=0) break; end = GetTickCount(); printf("Diff_time = %ld, n",end-start); 来获取cvWaitKey(1)的运行时间,发现Diff_time为16,也就是cvWaitKey(1)耗时16ms,这条语句不是应该延时1

android-求大神指导Android中重写SimpleAdapter类引getCount空指针异常,万分感谢

问题描述 求大神指导Android中重写SimpleAdapter类引getCount空指针异常,万分感谢 重写的BaseAdapter: public class MyAdapter extends BaseAdapter { List<UserInfo> userInfos=new ArrayList<UserInfo>(); Context context; public MyAdapter(Context cList<UserInfo> userInfos) {

OpenCV中的级联分类器Cascade Classifier(面部识别)

OpenCV中的级联分类器Cascade Classifier Goal In this tutorial you will learn how to: Use the CascadeClassifier class to detect objects in a video stream. Particularly, we will use the functions: load to load a .xml classifier file. It can be either a Haar or

OpenCV中的KMeans算法介绍与应用

一.KMeans算法介绍 KMeans算法是MacQueen在1967年提出的,是最简单与最常见的数据分类方法之一.它做为一种常见数据分析技术在机器学习.数据挖掘.模式识别.图像分析等领域都有应用.如果从分类角度看,KMeans属于硬分类即需要人为指定分类数目,而MeanSift分类方法则可以根据收敛条件自动决定分类数目.从学习方法上来说,KMeans属于非监督学习方法即整个学习过程中不需要人为干预的学习方法,自动完成整个数据集合分类.对于给定的数据集合DS (Data Set)与输入的分类数目