opencv功能实现

opencv function implementation

本文关键字:实现 功能 opencv      更新时间:2023-10-16

我想知道opencv是如何对矩阵进行运算的。例如,当我为编写代码时

cv::add (Mat mat1, Mat mat2, Mat &result)

使用两个for loops,1000x750图像大约需要120-130ms。但使用opencv添加功能需要6-7毫秒。有人知道他们的诀窍是什么吗?我想学习它,以便能够编写opencv没有的函数。

我在opencv内部搜索了一下,找到了这两个.cpp文件(第一个,第二个),但我不知道我是否在找正确的地方。

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

谢谢,

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

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

1.SIMD优化

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

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

同样,为了在ARM平台中使用,代码正在进行NEON优化(主要由英伟达团队为其Tegra处理器提供)。示例

2.通过TBB的多线程

另一个重要的问题是TBB的使用,有些人已经在他的回答中提到了它,你必须用TBB编译OpenCV源代码才能实现它。正如他所提到的,这可能不是一项容易的任务。许多功能,如人脸检测等,都是在OpenCV中进行TBB优化的。

OpenCV执行一些其他技术,如循环展开。(示例)它提供了轻微的改进。现代编译器在这方面已经非常擅长了。

有关优化C++代码的更多详细信息,您可以阅读AgnerFog的优化技术手册。所有这些细节都是相关的。

在本页中,他们在文档末尾表示速度更快,因为核心的功能是通过"英特尔线程构建块"启用多线程的。