opencv函数实现

时间:2013-08-25 14:07:38

标签: c++ function opencv

我想知道opencv如何对矩阵进行操作。例如,当我为

编写代码时
cv::add (Mat mat1, Mat mat2, Mat &result)

使用两个for loops,1000x750图像大约需要120-130毫秒。但是使用opencv add函数需要6-7 ms。有谁知道他们的伎俩是什么?我想学习它能够编写opencv没有的函数。

我在opencv中搜索并找到这两个.cpp文件(firstsecond),但我不知道我是否正在寻找正确的位置。

我只是想知道如何使用这种力量。有人能帮帮我吗?

谢谢,

2 个答案:

答案 0 :(得分:4)

您提供的两个cpp文件用于GPU操作(CUDA和OpenCL)。从您的问题来看,我认为您正在寻找非GPU操作,这是correct file.

OpenCV以其速度而闻名,它来自于他们在代码中进行的大量优化。我会给其中一些人提供一些提示。

<强> 1。 SIMD优化

这是OpenCV的主要优化来源之一。几乎所有算术运算都经过SIMD优化。在您的情况下,SIMD优化是更好的选择(OpenCV已经完成)。它会将性能提高几倍,具体取决于您的实施级别。所有现代处理器都带有内置的SIMD支持(SSE,AVX等)。

与普通的C ++相比,它有点复杂。不是一次只从两个矩阵中添加两个像素,而是同时添加大约16个像素(它取决于数据类型)。从理论上讲,它提供了16倍的加速。我在学习SIMD汇编时写的Here is a simple example(你可以使用更简单的内在函数)。它没有太多优化(只是为了学习而编写),仍然提供20倍的加速。

同样,对于在ARM平台中使用,代码正在进行NEON优化(主要由Nvidia Team为其Tegra处理器提供)。 Example

<强> 2。通过TBB

进行多线程处理

另一个重要的是使用TBB,有人已经在他的回答中提到过它,你必须用TBB编译OpenCV源来实现它。正如他所提到的,这可能不是一件容易的事。面部检测等许多功能都是在OpenCV中进行TBB优化的。

OpenCV还做了一些其他技术,如循环展开(Example)它略有改进。现代编译器已经非常擅长这一点。

您可以阅读 Agner Fog's optimization techniques manuals ,了解有关优化C ++代码的更多详细信息。所有这些细节都是相关的。

答案 1 :(得分:2)

this页面中,他们在文档末尾说它更快,因为核心功能是通过英特尔螺纹构建模块启用多线程的。