C++ OpenCV Mat到alglib real 2d阵列的转换

C++ OpenCV Mat到alglib real 2d阵列的转换,c++,opencv,data-conversion,mat,alglib,C++,Opencv,Data Conversion,Mat,Alglib,如何将Opencv Mat转换为Alglib real 2D阵列 这是一个我被绊倒的例子 Mat Col(28539,97,CV_32F); 我想把这个Mat转换成alglibreal\u 2d\u数组来训练分类器 Mat Col(28539, 97, CV_32F); 是一个OpenCV二维(28539行,97列)密集浮点(CV_32F=float)数组 alglib几乎相当于 Mat中的数据布局与real_2d_array兼容(以及其他工具包和SDK中的大多数密集阵列类型) 转换的简单方

如何将Opencv Mat转换为Alglib real 2D阵列

这是一个我被绊倒的例子

Mat Col(28539,97,CV_32F);
我想把这个
Mat
转换成alglib
real\u 2d\u数组
来训练分类器

Mat Col(28539, 97, CV_32F);
是一个OpenCV二维(28539行,97列)密集浮点(CV_32F=float)数组

alglib几乎相当于

Mat
中的数据布局与
real_2d_array
兼容(以及其他工具包和SDK中的大多数密集阵列类型)

转换的简单方法是:

const int rows(28539);
const int columns(97);

matrix.setlength(rows, columns);

for (int i(0); i < rows; ++i)
  for (int j(0); j < columns; ++j)
    matrix(i, j) = Col.at<float>(i, j);
  • xy
    是训练集(对应于样本组件的行和对应于变量的列)

    对于分类任务,列的第一个
    nvars
    包含独立变量。最后一列将包含类号(从0到
    nclasses-1
    )。分数值四舍五入为最接近的整数

  • npoints
    是训练集大小(
    =1
  • nvars
    是自变量的数量(
    =1
  • nclasses
    必须大于1才能进行分类
  • ntrees
    是森林中的树数(
    =1

  • r
    是用于构建单个树的训练集的百分比(
    0info
    输出参数的值?返回代码应为1。而且
    矩阵的最后一列必须包含类号(在您的情况下为0到6)。我检查了信息的输出,它是-1,这意味着参数有一些问题。让我告诉你一些细节…矩阵包含训练数据,最后一列是类标签。其他参数为alglib::dfbuildrandomdecisionforest(矩阵,28539,96,7,80,0.66,info,df,rep);我使用的类总数是7(脸的7个部位,即鼻子、嘴巴、头发等)
    
    const int rows(28539);
    const int columns(97);
    
    matrix.setlength(rows, columns);
    
    for (int i(0); i < rows; ++i)
      for (int j(0); j < columns; ++j)
        matrix(i, j) = Col.at<float>(i, j);
    
    void alglib::dfbuildrandomdecisionforest(
        real_2d_array xy,
        ae_int_t npoints,
        ae_int_t nvars,
        ae_int_t nclasses,
        ae_int_t ntrees,
        double r,
        ae_int_t& info,
        decisionforest& df,
        dfreport& rep);