opencv功能实现
opencv function implementation
我想知道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的优化技术手册。所有这些细节都是相关的。
在本页中,他们在文档末尾表示速度更快,因为核心的功能是通过"英特尔线程构建块"启用多线程的。
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何使用lock_guard在c++11中实现scoped_lock功能
- 多次实现成员功能
- 如何在现代C++中实现没有宏的系统特定功能
- 使用 std::call_once 实现类似单例的功能
- "this"关键字在C++中的实现限制,因为它与危险但功能示例有关
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 如何实现删除数组的功能?
- 我当前实现的双向链表类是否需要重构迭代器 end() 功能?
- 如何实现功能线程安全
- 实现功能对象绑定而无需使用C 11
- 基于类实现功能的困难
- 远程过程调用和MIDL:如何使用[OUT]属性实现功能
- 对CUDA实现功能的未定义引用
- 在班级基础中实现功能的最有效方法
- 在C 中超载宏实现功能
- 如何在编译过程中实现功能单元测试
- 实现功能齐全的移位流语法
- 在C++中实现功能的两种方法有什么区别?