本文是一个小系列的第一篇,MCU部署OpenCV的“先跑篇”,稍后会陆续有“配置篇”、“实战篇”、“进阶篇”、“优化篇”,带您牵手OpenCV,进入OpenCV的广阔世界。
说到OpenCV,想必不用小编再多说什么了吧,可谓是计算机视觉处理届的扛把子选手。
对她仰慕已久
但凡是接触过/亲手把玩过数字图像的朋友们,都或多或少的接受过OpenCV的辅佐吧。小到:图像数据的打开/保存、摄像头数据的读取,大到目标识别,神经网络等,可以说,OpenCV就像是一个无所不能的存在。想做图像开发吗?come on,OpenCV准能大手一挥,委派手下将领来辅佐我们打下江山。
看到这里,相信大家已经从字里行间感受到了,小编这无处安放的、快要溢出纸面的、满满的膜拜和敬仰之情了吧。没错,小编也正是OpenCV的受益者,当你还在为如何打开一张粉丝发过来的彩图而一筹莫展之时,OpenCV就会在远方呼唤:试试imread?图片太小,看不清偶像的签名?试试resize?是的,无所不能的OpenCV就是能随时满足我们的任何开发需求,或者说的稍显专业范一点:知道《数字图像处理-冈萨雷斯》吗?相信我,OpenCV里都有。
写到这儿,小编真想直接一个一键三连。
配得上她吗?
就不再过多的感慨了,让我们开始下一部分,说说今天的主题。
相信大家也有注意到,即便OpenCV在PC端混的风生水起,可是在我们的嵌入式平台上,这里特指MCU平台(同为嵌入式平台,隔壁MPU仗着DDR+强力A核已经成功上船),可以说是障碍重重。
首先第一个遇到的障碍是代码空间,尽管OpenCV的功能强大,其代码量也让人心头一惊。低头翻翻芯片手册,看到那捉襟见肘的存储容量,基本可以直接放弃跑OpenCV的想法了。
第二个大障碍则是算力,与PC机主频上GHz的多核处理器相比,MCU的处理能力确实堪忧。
但是,自从出现了i.MX RT系列的MCU,让人们看到了在嵌入式MCU的应用环境中,借助OpenCV进行图像开发的希望。
i.MX RT具有600MHz以上的主频,让运行OpenCV成为可能。而其对外部存储扩展的支持,正好能够解决代码空间的问题。i.MX RT系列为部署OpenCV提供了一个新的突破口。
还有第三大障碍,在MCU平台上跑OpenCV没有先例可循,想玩但感觉无从下手。
那么,下面小编就来引领大家开始OpenCV的另一种玩儿法,在MCU平台上进行部署,所选用的平台是拥有高达1GHz主频的,我们的i.MX RT1170系列MCU,她拥有最大2MB的内部RAM,和外扩的QSPI Flash用于代码存储,以及外扩的SDRAM用于庞大的数据存储。
好好地端详
开始把玩之前,先来正式介绍一下这次的主角,大名鼎鼎的OpenCV项目。
OpenCV(开源计算机视觉库:http://OpenCV.org)是一个包含数百种计算机视觉算法的开源库。没错, OpenCV是开源的,不收费哟,太良心。
OpenCV具有模块化结构,这意味着其包括多个共享或静态库。例如:核心功能、图像处理、视频分析、相机校准和3D重建(calib3d)、2D功能框架(features2D)、对象检测(objdetect)、高级GUI(highgui)、视频I/O(Video)。可以说,涵盖了几乎所有的数字图像处理领域。
牵手前的准备
认识了我们的主角,下面我们来看看移植上可能会遇到的问题,当然上文所述,算力和代码大小的问题也要考虑到:
编译方式/最终呈现方式:这个主要是涉及到我们最终如何使用OpenCV代码,是源码嵌入还是用静态链接库的形式。
小编这里直接选择编译成静态链接库,这样就不用每次都集成源码到工程中,更加方便。
不过,有一个问题要注意,因为OpenCV代码主体是C++编写的,受编译器版本影响,可能会导致编译出来的静态链接库并不兼容当前工程。
因此,要注意,编译器的版本要保证一致,切记!!
编译工具链:在PC上,一般是选用GCC / visual studio(分别对应linux和windows平台)进行代码编译,到了嵌入式平台,要注意使用对应的嵌入式开发工具链,小编这里推荐arm-none-eabi-gcc以及ARMCland(Keil)。
可能有朋友要问了啊,IAR呢?别问,问就是小编用Keil比较熟悉,手动捂脸。。。。
头文件和数据类型问题:不同的工具链的头文件组织/构成方式不同,换句话说,有些头文件,GCC有而ARMCLang可能没有,需要特殊考虑。
而数据类型问题主要体现在不同编译器,对于使用typedef重定义的整数类型的解释方式。
代码大小和算力:这里小编没有进行特殊的代码级优化,完完全全的放手让编译器帮我们去做了,例如使用GCC的-o3,ARMCLand的-oszie / -ofast等
操作系统支持:因为OpenCV的一些代码是要依赖于OS的,例如多进程 / 进程通信等,而我们的MCU平台尽管也支持OS。
但是一般都是多线程OS,不太能满足OpenCV的要求。当然,除了多进程这一点,我们的MCU平台还是可以胜任的。
针对这一点,就没啥可说的了,简单粗暴一点:直接disable掉这些模块。
配置工具适配:因为我们这里不使用VS进行代码管理,而OpenCV可以基于CMake进行工程管理并借助Make进行代码编译。
那么针对不同的开发端OS,Linux / Windows,需要安装对应版本的CMake + Make工具。
憧憬与遐想
随着人工智能技术的普及,人们期待在MCU平台上能进行更加复杂的图像处理,成熟的OpenCV自然而然地引起了我们的高度关注。
但是由于前面提到的那些障碍以及对操作系统的依赖,在MCU上跑OpenCV能够做到什么程度,还是需要不断地挖掘和探索。
从我们目前工作的情况看,可以说一些基础的图像操作:resize、rotate、边缘提取以及基本的滤波算法等,完全没问题。小编也将在后面的系列中为大家一一揭密。
当然,OpenCV+MCU仍然是一个全新的领地,具体能做到什么,还要大家发挥想象力,让OpenCV能够在MCU平台上开出绚烂的花朵!
限于篇幅,本期小编就和大家聊到这儿,下期将为大家详细介绍如何进行工具链的安装,以及如何对OpenCV源码进行配置的具体方法。
全部0条评论
快来发表一下你的评论吧 !