出于性能原因,我在最新项目中使用 C 语言中的 OpenCV 作为图像处理工具。在使用 Open CV 时,我发现 Open CV 对矩阵运算的库支持较少。例如,如果想将列向量添加到矩阵中的每一列,我将不得不编写一个自定义函数来执行此操作。在 Matlab 中还有更多看起来微不足道的操作,在 Open CV 中缺失 - 类似于每列的规范、按列最小/最大值等。简而言之,在 Open CV 中似乎缺少矩阵上的所有列方式操作(我会感到惊讶如果我没有找到更多)。库的矩阵操作支持非常少。这是图书馆的设计决定,还是有某种扩展可以帮助我解决这个问题。我相信一定有其他人观察到并做了一些关于缺乏支持的事情。
问问题
2237 次
1 回答
3
OpenCV 可能无法完全替代 MatLab,但它的矩阵支持还是相当不错的。您可能会发现您正在寻找的某些功能是存在的,只是名称不同。
例如,如果想为矩阵中的每一列添加一个列向量,我将不得不编写一个自定义函数来执行此操作。
你可以通过几种方式做到这一点;可能最简单的是范围。请参阅下面的一种解决方案。
每列的范数
使用矩阵范围在循环中选择每一列:
cv::Mat m;
// ...
for (unsigned c = 0; c < m.cols(); c++)
{
cv::Mat col(m, cv::Range::all(), cv::Range(c, c+1));
double n = cv::norm(col, NORM_L2);
}
逐列最小/最大等
该cv::reduce
函数提供了所有这些类型的功能:
cv::reduce(InputArray src, OutputArray dst, int dim, int rtype);
// where rtype = CV_REDUCE_MIN, CV_REDUCE_MAX, etc
简而言之,Open CV 中似乎缺少矩阵上的所有 Column wise 操作(如果我没有找到更多,我会感到惊讶)。
cv::reduce()
也执行求和和平均。您可以选择按列或按行执行。如果这些操作不足以满足您的需求,您实际上可能必须编写自己的函数。
在线文档非常好:
本教程有更多关于内存管理和矩阵的信息,特别是解释范围以及如何共享内存:
于 2013-10-05T07:09:44.577 回答