我想知道OpenCV如何对矩阵进行操作。例如,当我编写代码时...cv::add (Mat mat1, Mat mat2, Mat &result) 使用两个for循环,对于1000x750的图像,需要大约120-130毫秒。但是使用opencv add函数只需要6-7毫秒。有人知道他们的诀窍吗?我想学习它,以便能够编写opencv没有的函数。我已经在opencv中搜索并找到了这两个.cpp文件(first, second),但我不知道我是否在正确的地方查找。我只想知道如何使用这种功能。有人可以帮帮我吗?谢谢,
您提供的两个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 ++代码的更多详细信息。所有这些细节都是相关的。