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
是训练集大小 (>=1
)。
nvars
是自变量的数量 (>=1
)。
nclasses
必须 >1 才能进行分类。
ntrees
是森林中的树木数量 (>=1
)。
r
是用于构建单个树的训练集的百分比 (0 < R <= 1
)。
其余参数为输出参数。如有问题请查看info
:
info
返回码:
-2,如果有一个点的类号在[0..nclasses-1]
之外。
-1,如果传递了不正确的参数(npoints<1
、nvars<1
、nclasses<1
、ntrees<1
、r<=0
或 r>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 真实二维数组的转换的主要内容,如果未能解决你的问题,请参考以下文章