2013-10-05 188 views
1

出于性能原因,我在C中使用OpenCV作为图像处理工具。在使用Open CV时,我发现Open CV对矩阵操作的库支持较少。例如,如果想要将列向量添加到矩阵中的每一列,我将不得不编写一个自定义函数来执行此操作。还有更多的操作在Matlab中看起来微不足道,在Open CV中缺失 - 像每列的规范,列明智的最小/最大等等。简而言之,矩阵中的所有列操作似乎都在Open CV中缺失(我会感到惊讶如果我没有找到更多)。图书馆的矩阵操纵支持是非常小的。这是一个图书馆的设计决定,还是有某种扩展可以帮助我完成这个任务。我相信肯定还有其他人对缺乏支持进行了观察和处理。任何指针?openCV中的矩阵操作

回答

2

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 

在一个矩阵总之一切逐列操作似乎打开CV失踪(我会感到惊讶,如果我没有找到更多)。

cv::reduce()也执行总和和平均值。您可以选择按列或按行执行。如果这些操作不足以满足您的需求,您可能需要编写自己的功能。

在线文档是相当不错的:

本教程对内存管理和矩阵更多的信息,尤其是解释有关范围和如何可以共享内存:

+0

我在C编写代码,而不是C++,这样我就可以移植到嵌入式平台。你有指向C文档的指针吗?你的答案仍然给我一个想法如何解决这个问题。谢谢 – Malice

+0

C API对应于OpenCV 1.x,而2.x是向C++的迁移。一些API仍然存在于C语言中,所以通常你可以把命名空间和函数名连接起来,所以(例如)使用'cv :: reduce',给出'cvReduce'。但总的来说,C++(或Python)是一条可行的路线,文档将列出上述参考文献中支持的所有绑定。您定位的是哪个平台?无论如何,大多数人都有C++支持。 – gavinb

+1

@Malice如果你坚持使用旧版API,你实际上没有权利抱怨缺乏功能。转到http://docs.opencv.org/modules/core/doc/old_basic_structures.html,然后在索引中查找C函数。当然,使用C++的OpenCV可以移植到许多嵌入式平台上,这是你不能用Matlab获得的功能。 – Bull