什么是PXP,OpenCV和MCU的优化编译方案,pxp

通过前几期的文章,相信大家对OpenCV以及其移植和部署方法都有了一定的了解,一句话概括一下:OpenCV是一个包含了上百个经典计算机数字图像处理算法的开源代码库。 请注意这里的开源!是的,这么一个宝库是不收费的哟。同时,为了更好的提升代码执行效率,OpenCV本身也集成了多种硬件加速器资源,例如:SSE,NEON,OpenCL,CUDA,OpenCV4Tegra等。

但是,唯独缺少了MCU平台的硬件资源加速,特别是对于那些本身就有硬件加速器的MCU,可以说有一种力有余而心不足的感觉。例如前几期的主角,集成了PXP以及2D-GPU的RT1170系列MCU。 既然没有,那我们就自己造。 本期小编将带着大家一起补齐这最后一块儿短板,为OpenCV代码添加基于PXP的硬件加速支持。 也许大家对PXP还不是很熟悉,就先介绍一下什么是PXP。

PXP全程叫做像素处理管道,用来对送入显示设备的图像数据进行处理、或是视频图像数据的混合。可以最小化显示流水线所需的内存占用空间,并为无 SDRAM 和基于 SRAM 的系统提供优化的内存空间和性能。 PXP本身集成了多个彼此独立又可以协同工作的处理阶段,以实现灵活的像素处理管道。 完整的PXP模块如下:

通过集成多个模块,消除了对外部存储器的中间缓冲操作,从而降低了外部存储器带宽、功耗和软件控制复杂性。 PXP 将以下内容组合成一个处理引擎:

放缩

颜色空间转换

旋转

PXP的主要特点包括:

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语法来实际控制代码中参与编译的内容了。

编辑:黄飞

 

相关推荐

相关文章