OpenCV函数实现

3
我想知道OpenCV如何对矩阵进行操作。例如,当我编写代码时...
cv::add (Mat mat1, Mat mat2, Mat &result)

使用两个for循环,对于1000x750的图像,需要大约120-130毫秒。但是使用opencv add函数只需要6-7毫秒。有人知道他们的诀窍吗?我想学习它,以便能够编写opencv没有的函数。
我已经在opencv中搜索并找到了这两个.cpp文件(first, second),但我不知道我是否在正确的地方查找。
我只想知道如何使用这种功能。有人可以帮帮我吗?
谢谢,
2个回答

5
您提供的两个cpp文件是用于GPU操作(CUDA和OpenCL)。从您的问题中,我认为您正在寻找非GPU操作,这是正确的文件
OpenCV以其速度而闻名,这来自他们在代码中进行了许多优化。我将给出一些提示。 1. SIMD优化 这是OpenCV中主要的优化源之一。几乎所有算术运算都经过了SIMD优化。在您的情况下,使用SIMD优化是更好的选择(OpenCV已经这样做了)。它可以根据您的实现水平提高几倍性能。所有现代处理器都具有内置的SIMD支持(SSE、AVX等)。
这与我们平常使用的C++有些复杂。你不是每次只从两个矩阵中添加两个像素,而是同时添加一些16个像素(具体取决于数据类型)。理论上它提供了16倍的加速。这里有一个简单的例子,我在学习SIMD汇编语言时写的(你可以使用更简单的Intrinsics)。虽然它并没有经过太多优化(只是为了学习),但仍然提供了20倍的加速。
同样地,在ARM平台上使用,代码正在进行NEON优化(主要由Nvidia团队为其Tegra处理器做出贡献)。示例 2. 通过TBB进行多线程处理 另一个重要的是使用TBB,有人已经在他的答案中提到了它,你需要使用TBB编译OpenCV源代码才能实现它。正如他所提到的,这可能不是一件容易的事情。许多函数,如人脸检测等,在OpenCV中都进行了TBB优化。
OpenCV还使用了其他技术,如循环展开。 (示例) 这提供了轻微的改进。现代编译器已经非常擅长此项工作。
你可以阅读Agner Fog的优化技术手册以获取有关优化C ++代码的更多详细信息。所有这些细节都是相关的。

2
这个页面的文档末尾提到,它更快是因为核心功能通过英特尔线程化构建块启用了多线程。

谢谢,我能否通过在代码中某处键入“MULTI_THREAD_ENABLED”之类的内容来使用多线程?我对多线程不是很了解。如果没有这样简单的用法,您能指导我从哪里开始吗? - smttsp
多线程不是一件容易的任务,创建多线程应用程序很困难。你可以在这里查看:http://softpixel.com/~cwright/programming/threads/threads.c.php - jambono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接