美文网首页
c++ libsvm 分类图片的一次记录-图片转成prob格式

c++ libsvm 分类图片的一次记录-图片转成prob格式

作者: jyx2 | 来源:发表于2020-07-11 00:22 被阅读0次

先介绍一下工程文件的布局,引入svm.cpp和main.cpp.

image

dealimage = dealimage.reshape(1, 1);//图片序列化

trainingData.push_back(dealimage);//序列化后的图片依次存入

dealimage是读入的图片数据,进行了resize成同一尺度。

trainingData是一个mat类型的数据,尺寸为 图片张数*图片像素点数。

在进行内存分配,相关的结构体都能在svm.h中找到


#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
struct svm_parameter param; // set by parse_command_line
struct svm_problem prob; // set by read_problem
struct svm_model *model;
struct svm_node *x_space;
prob.l = trainingData.rows;
prob.y = Malloc(double, (prob.l));
prob.x = Malloc(svm_node*, (prob.l ));


for (int i = 0; i < trainingData.rows; i++)
{

  x_space = Malloc(svm_node, (trainingData.cols + 1));//这里要特别注意!! 要加一个存-1
  for (int j = 0; j < trainingData.cols; j++)
  {
    struct svm_node x ;
    ostringstream uchar2d;
    x.index = j + 1;
    x.value = trainingData.at<uchar>(i, j);
    x_space[j] = x;
  }
  struct svm_node x;
  x.index = -1;//!!!一定要有存-1的步骤
  x_space[trainingData.cols] = x;
  prob.x[i] = x_space;
  prob.y[i] = labels[i];
}

这里有一个需要注意的地方,最后一个index需要存-1,这是因为svm.cpp在计算时,会有下面一个判断


double Kernel::dot(const svm_node *px, const svm_node *py)
{
  double sum = 0;
  while(px->index != -1 && py->index != -1)
  {
    if(px->index == py->index)
    {
      sum += px->value * py->value;
      ++px;
      ++py;
    }
    else
    {
      if(px->index > py->index)
        ++py;
      else
        ++px;
    }
  }
  return sum;
}

相关文章

网友评论

      本文标题:c++ libsvm 分类图片的一次记录-图片转成prob格式

      本文链接:https://www.haomeiwen.com/subject/vhqbcktx.html