专栏首页贾志刚-OpenCV学堂OpenCV加速与优化,让代码执行速度飞起来

OpenCV加速与优化,让代码执行速度飞起来

引子

做OpenCV开发这些年以来,很多人对OpenCV经常说的抱怨有如下两点:

1.OpenCV模块很多,是一个很重量级的视觉框架!

2.OpenCV速度有点问题,不够快!

针对对一个问题,OpenCV开发包包含的东西太多了,大而全,而它们的项目可能需要只是一点点,需要的是小而精,其实这个很容易解决,这个就是要求做好OpenCV的模块裁剪与移植,通过CMake自己编译,关于这个问题,我也写过一篇文章来介绍,感兴趣可以点击这里:

OpenCV实战应用必备技能 | 模块裁剪

第二个问题,我们可以分为几个部分来说明。

CPU加速

今天我们重点说说第二个问题,OpenCV速度没有达到项目要求怎么办,其实OpenCV发展到今天在不同的架构平台上都有一些底层的指令集支持的加速方法,在Windows系统下,OpenCV编译默认支持加速SSE3 指令集,同时还额外支持SSE4.2、AVX、AVX2等加速指令集,在编译时候CMake配置文件提供了下面选项支持:

CPU_BASELINE=SSE2 CPU_BASELINE=AVX 需要C++编译器支持 CPU_DISPATCH=SSE4_2,AVX CPU_DISPATCH=AVX CPU_DISPATCH=AVX,AVX2 额外的加速支持,同样需要编译器支持。

早期通过ENABLE的方式已经在OpenCV3.x之后被抛弃,下面这个几个选项是无效选项:

ENABLE_AVX ENABLE_AVX2 ENABLE_POPCNT

ARMv7架构系统下支持

NEON

这些方法的加速效果如何,答案是通过编译支持的SSE/AVX加速,基本上可以获得1.3~3.0之间的加速执行。这个也就是为什么有时候我们直接无感的原因,就是加速不够明显!

一般情况下,自己重新编译OpenCV源码,CMake的时候都会生成如下的一些信息:

其实这个时候,还有几个比较有用的Flag可以勾选上,会起到明显的加速效果:

WITH_TBB

默认情况下是OFF、勾选可以获得并行处理支持

在TBB开启支持的情况下,可以通过下面的两个API设置线程数目,尝试获得并行执行能力。

setNumThreads() // 设置线程数目
getNumThreads() // 查询线程数目,为0表示顺序执行

CV_ENABLE_IPP

默认情况下是OFF、早期的OpenCV版本可以这么干,现在的OpenCV版本不支持

GPU加速

OpenCV CUDA支持下面的模块的加速运行

这个OpenCV默认是不支持,需要自己重新编译OpenCV源码,如何编译,参考我在B站的视频教程:

https://www.bilibili.com/video/av71643385

OpenCV中深度神经网络模块之前一直不支持CUDA作为计算后台的加速运行,就在前几天,OpenCV社区刚刚完成此项支持,所以OpenCV DNN模块在后续下个版本中将可以使用CUDA加速。简单点说,OpenCV DNN模块将会获得更大的速度优势。OpenCV也必将在更多边缘设备上得到应有。

OpenVINO加速

英特尔从去年推出视觉加速框架,对OpenCV所有的模块都有加速,特别是对深度神经网络模块,支持CPU/GPU(HD显卡)/加速棒等硬件加速,特别值得一提的是其CPU基本的加速,对人脸检测、对象检测等深度神经网络均可以达到实时运行级别,本人也写过一系列的OpenVINO SDK开发的相关技术文章。OpenVINO的安装与配置,代码演示,可以观看我在B站的视频教程:

https://www.bilibili.com/video/av71979782

相关技术文章汇总在这里:

英特尔 OpenVINO深度学习推理框架 开发技术系列文章汇总

总结与后记

上述各种加速手段,都有一定的限制,只有选择适合应用场景的加速方法才是正确的解决问题之道。另外OpenCV在开发阶段,不同代码写法与实现效率有时候会有云泥之别!这个更加体现开发者本身的技术水准。最后放两张图,看一下,OpenCV加速效果,分别是传统的图像处理方式与深度学习模型加速视频演示,帧率分别超过 199与90 FPS 以上!

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于提交和合并流水线的实践

    泽阳,运维工程师,实际工作经验4-5年,经历了传统运维到自动化运维整个过程。整理分享DevOps、CICD、编程开发、监控、日志等相关技术实践!定期更新,来吧一...

    泽阳
  • Android Gradle 多渠道打包

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    黄林晴
  • 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

    到目前位置我们一直在编写单文件代码,只有一个 main.go 文件。本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件。

    老钱
  • Runtime再理解

    Objective-C、Java、Swift等高级语言,其可读性很强,但是并不能直接被机器识别,所以就需要将这些源代码编译成相对应的机器语言(比如汇编语言),最...

    拉维
  • 【PCL入门系列之一】点云库PCL简介

    本系列文章首先介绍什么是PCL以及PCL的功能。之后将讲解如何在Linux上安装PCL,为下一步测试、编程、开发做准备。后续的文章将对PCL官网...

    小白学视觉
  • vue加载优化(全)

    程序员不务正业
  • Linux下如何解压tar.gz和tar.bz2和zip

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    望天
  • pfring模块安装使用

    PF_RING是Luca Deri发明的提高内核处理数据包效率,并兼顾应用程序的补丁,如Libpcap和TCPDUMP等,以及一些辅助性程序(如ntop查看并分...

    随心助手
  • 基于create-react-app打包编译自己的第三方UI组件库

    这篇文章主要是总结一下我们在工作中如何为公司开发内部的第三方UI组件,并通过npm install的方式安装的一些步骤和思路。在学习完这套发布方法后大家也可以快...

    徐小夕
  • C++替代关键词(and,or,not)

    Qt君

扫码关注云+社区

领取腾讯云代金券