OpenCV Mat 到 alglib 真实二维数组的转换

Posted

技术标签:

【中文标题】OpenCV Mat 到 alglib 真实二维数组的转换【英文标题】:OpenCV Mat to alglib real 2d Array conversion 【发布时间】:2014-09-26 11:01:22 【问题描述】:

如何将 Opencv Mat 转换为 Alglib 实二维数组?

这是一个我被卡住的例子

Mat Col(28539,97,CV_32F);

我想将此 Mat 转换为 alglib real_2d_array 以训练分类器。

【问题讨论】:

【参考方案1】:
Mat Col(28539, 97, CV_32F);

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

alglib 几乎等同于 datatype 是

// bi-dimensional real (double precision) array
real_2d_array matrix;

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

Mat::at 返回对指定数组元素的引用。

编辑

来自reference manual:

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

xy是训练集(行对应样本组件,列对应变量)。

对于分类任务,列的第一个 nvars 包含自变量。 last 列将包含班级编号(从 0 到 nclasses-1)。小数值四舍五入到最接近的整数。

npoints 是训练集大小 (&gt;=1)。 nvars 是自变量的数量 (&gt;=1)。 nclasses 必须 >1 才能进行分类。 ntrees 是森林中的树木数量 (&gt;=1)。 r 是用于构建单个树的训练集的百分比 (0 &lt; R &lt;= 1)。

其余参数为输出参数。如有问题请查看info:

info 返回码: -2,如果有一个点的类号在[0..nclasses-1]之外。 -1,如果传递了不正确的参数(npoints&lt;1nvars&lt;1nclasses&lt;1ntrees&lt;1r&lt;=0r&gt;1)。 1,如果任务已解决。

【讨论】:

感谢 manlio 的回复。我已经这样做了。而我设置的其他参数为 alglib::dfbuildrandomdecisionforest(matrix, 28539, 96,7, 80, 0.66, info, df, rep);但仍然没有建立模型。我还检查了矩阵中包含的数据,这也是正确的。你能建议我做错什么吗(比如将参数传递给随机森林) 您检查过info 输出参数的值吗?返回码应为 1。matrix 的最后一列也必须包含类号(在您的情况下为 0 到 6)。 我检查了信息的输出,它是-1,这意味着参数有问题。让我告诉你一些细节......矩阵包含训练数据,最后一列是类标签。其他参数如 alglib::dfbuildrandomdecisionforest(matrix, 28539, 96,7, 80, 0.66, info, df, rep); 我使用的总课程是 7 个(面部的 7 个部分,即鼻子、嘴巴、头发等)

以上是关于OpenCV Mat 到 alglib 真实二维数组的转换的主要内容,如果未能解决你的问题,请参考以下文章

将opencv Mat创建为二维网格

OpenCV二维Mat数组(二级指针)在CUDA中的使用

CV::Mat介绍

opencv中Mat使用

opencv中Mat使用

Mat的单通道作为矩阵Opencv