c++ - opencv函数实现

标签 c++ function opencv

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

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

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

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

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

谢谢,

最佳答案

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

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

<强>1。 SIMD 优化

这是 OpenCV 优化的主要来源之一。几乎所有算术运算都经过 SIMD 优化。在您的情况下,SIMD 优化也是更好的选择(OpenCV 已经完成)。根据您的实现水平,它可以将性能提高数倍。所有现代处理器都带有内置的 SIMD 支持(SSE、AVX 等)。

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

同样,为了在 ARM 平台中使用,代码正在优化 NEON(主要由 Nvidia 团队为其 Tegra 处理器贡献)。 Example

<强>2。多线程通过 TBB

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

OpenCV 还采用了一些其他技术,例如循环展开(Example)它提供了轻微的改进。现代编译器已经非常擅长这一点。

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

关于c++ - opencv函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18429837/

相关文章:

python - 没有视频输出OpenCV Python

c++ - 从 OPENCV 中的图像中删除特定图案

c++ - 可以将静态 constexpr 变量用作模板参数吗

c++ - 尝试实现 PIMPL 习语时如何避免 "redefinition; different basic types"

c++ - 将 eigen::MatrixXf 映射到现有的 eigen::matrixXf

python - 如果每个函数都没有抛出任何错误,则按顺序运行 python 函数

function - 去链式函数调用?

c++ - 蛇算法 - opencv 事件轮廓 - 效果不佳

c++ - 从 std::string 中删除所有 xml 标签

javascript - 1个函数独立替换4个不同ID的innerHTML