这个秋天,OpenCV和MCU更配哟(优化篇1)
来源:恩智浦MCU加油站发布时间:2022-12-082606浏览
询问 AI通过前几期的文章,相信大家对OpenCV以及其移植和部署方法都有了一定的了解,一句话概括一下:OpenCV是一个包含了上百个经典计算机数字图像处理算法的开源代码库。请注意这里的开源!是的,这么一个宝库是不收费的哟。同时,为了更好的提升代码执行效率,OpenCV本身也集成了多种硬件加速器资源,例如:SSE,NEON,OpenCL,CUDA,OpenCV4Tegra等。但是,唯独缺少了MCU平台的硬件资源加速,特别是对于那些本身就有硬件加速器的MCU,可以说有一种力有余而心不足的感觉。例如前几期的主角,集成了PXP以及2D-GPU的RT1170系列MCU。既然没有,那我们就自己造。本期小编将带着大家一起补齐这最后一块儿短板,为OpenCV代码添加基于PXP的硬件加速支持。也许大家对PXP还不是很熟悉,就先介绍一下什么是PXP。PXP全程叫做像素处理管道,用来对送入显示设备的图像数据进行处理、或是视频图像数据的混合。可以最小化显示流水线所需的内存占用空间,并为无 SDRAM 和基于 SRAM 的系统提供优化的内存空间和性能。PXP本身集成了多个彼此独立又可以协同工作的处理阶段,以实现灵活的像素处理管道。完整的PXP模块如下:原计划本系列的四篇都已经发表了,分别是“先跑篇”、"配置篇"、“实战篇”和“进阶篇”,现在已经入冬,我们这个秋天的系列将以两篇“优化篇”结束,带您牵手OpenCV,进入OpenCV的广阔世界。

- 放缩
- 颜色空间转换
- 旋转
- BitBlit
- 支持多种输入/输出格式,YUV/RGB/Grayscale
- 支持RGB/YUV格式数据的放缩
- Aplha blending+overlay
- 多种角度旋转:0,90,180,270;并且可以和水平/垂直翻转同时进行
- 颜色空间转换
- 图像resize
- 标准的2D-DMA操作
了解了PXP模块,下面就开始应用PXP对我们的OpenCV代码开始改造。下面先拿Resize和Rotate这两个函数作为目标,看看如何进行优化改造:
通过前几期,我们知道OpenCV基于模块化进行代码的组织,那么谁负责管理这些模块,并且通知编译器哪些模块需要被编译进最终的镜像文件呢?这个答案就是CMake。
这是一款开源的,跨平台的工具,用于实现代码的构建、测试以及打包。
那么它是怎么工作的呢?就让我们先创建一个新的文件夹叫做build来存储构建文档。进入build并打开CMake-gui,顾名思义这个小工具就是一个带GUI显示的CMake工具:

新的变量会以红色字体显示,每一个模块都有一个与其相关的符号,在CMake文件CMakeLists.txt中定义,这些就是CMake的各个入口。
定义好这些符号之后,他们就变成了控制相关模块的开关。
如下图所示,有很多模块相关的符号,但是,只有那些被选中的模块才有机会被编译到最终的镜像中。
本例中,只有JPEG、PNG以及opencv_core才可以。

因此,为了添加PXP。我们也要添加这么一个类似的符号。首先,添加定义到CMakeLists.txt:

尽管说,放置位置比较随意。最好还是,将其添加到Option 3rd这一组中。现在就定义了一个叫做WITH_PXP的新符号,重新打开CMake-gui.exe,看看我们的改动是否已经生效:

改动生效,只不过万里长征才走过一小步。变量目前仅仅是对CMake可见的,编译系统还看不到。这就意味着,这些变量并不能作为宏来进行预处理。因此,我们还需要加一些:
if(WITH_PXP)
add_definitions(-DHAVE_PXP)
endif()这样一来,借助CMake提供的内建函数add_definitions,就可以传递一个新的符号HAVE_PXP到编译器作为一个预定义宏。代码中就可以使用这个新定义的宏符号了,使用方法如下:
#if HAVE_PXP
…
#else
…
#endif
当我们通过CMake-gui勾选了WITH_PXP符号之后,HAVE_PXP就会被同步定义,以控制代码块编译。
至此,我们就完成了CMake部分的OpenCV源码配置工作。添加了一个新的符号WITH_PXP负责管理PXP模块的添加,并且为了使得符号能够让程序本身可见,借用CMake的内建函数定义了一个编译器可见的宏:HAVE_PXP,随后就可以在代码中使用#if语法来实际控制代码中参与编译的内容了。
本文第二部分,小编将带大家一起开启我们的最终节:PXP优化,代码部分的编写。欢迎大家继续捧场。
恩智浦MCU加油站
这是由恩智浦官方运营的公众号,着重为您推荐恩智浦MCU的产品信息、开发技巧、教程文档、培训课程等内容。

长按二维码,关注我们
END
更多恩智浦AI-IoT市场和产品信息,邀您同时关注“NXP客栈”微信公众号

NXP客栈
恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。
长按二维码,关注我们
新闻来源:恩智浦MCU加油站,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
