c++ libsvm 分類圖片的一次記錄-圖片轉(zhuǎn)成prob格式

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

image

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

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

dealimage是讀入的圖片數(shù)據(jù),進(jìn)行了resize成同一尺度。

trainingData是一個(gè)mat類型的數(shù)據(jù),尺寸為 圖片張數(shù)*圖片像素點(diǎn)數(shù)。

在進(jìn)行內(nèi)存分配,相關(guān)的結(jié)構(gòu)體都能在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));//這里要特別注意??! 要加一個(gè)存-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];
}

這里有一個(gè)需要注意的地方,最后一個(gè)index需要存-1,這是因?yàn)閟vm.cpp在計(jì)算時(shí),會(huì)有下面一個(gè)判斷


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;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。