ARM集成opencv

来源:互联网 发布:比特大陆 知乎 编辑:程序博客网 时间:2024/05/21 15:04
转载一篇ARM做视觉的文章,入门看看


硬件:
核心mcu arm9 s3c2410嵌入式的应该知道这款吧
板子外围接口都有,USB,串口,网口,sd卡槽等
web camera (USB接口)
nand Flash 64M

软件版本:

boot: uboot1.2
Linux kernel:2.6.26
文件系统:yaffs
编译器:arm-gcc-linux 4.3.2
文件系统制作工具:busybox
以上是构建Linux系统软件

--------
OpenCV 2.8.2 源代码
cmake 工具

编译图像处理依赖库 所需

--------
宿主机
Ubuntu 12.04(tftp server)

这都是前期的准备

进入正题: 我的课题是《the real-time image processing system based on embedded arm Linux》

具体 bootloader 制作 Linux kernel 交叉编译 文件系统制作 我在大三时候嵌入式专业课就搞好了,只不过后来因为要加上Linux V4L(Video for Linux) 又重新做了一遍。不会的网上有很多资料。ps:最好加上USB挂在U盘的相关驱动

具体 到 opencv的交叉编译,首先一定要和文件系统相同版本的编译器来compile;cmake 有相关选项 编译选项有很多选上需要的,arm 不支持的不要选,不然编译会报错(我就编了两天 ,编出来了可依赖库文件)
--------------------------先写这么多,晚上接着跟#----------
不好意思,由于这几天比较忙就没空跟帖 所以今天晚上就抽个空论文看了一遍,继续写了。。。
针对于@张岱珅 说的问题 是我记错了,cmake是用的2.8.10的 OpenCV使用的是2.4版本(目前最新3.0左右吧),不好意思。
至于@chen jason @Kaixiang Wang 多线程的问题实际在我这次实现中 更多的注重ARM嵌入式Linux 移植 OpenCV so文件是否在已有的算法上可行,说实话结果并不是很好。

好了,各位大神的支教就说到这了,具体到立体标定,三维识别和建模的相关算法, 有兴趣的同学可以深究,目前算法OpenCV源代码中有Example是给出的。
--------------------------------------------割---------------------------------------
接下来接着说 移植 OpenCV Library 到 embedded Linux
<img src="https://pic2.zhimg.com/8769f73d508d30c8ae3db564895f4f05_b.png" data-rawwidth="728" data-rawheight="445" class="origin_image zh-lightbox-thumb" width="728" data-original="https://pic2.zhimg.com/8769f73d508d30c8ae3db564895f4f05_r.png">特地找了个Cmake-gui编译的时候的图,一般都是terminal下cmake就好了,但是gui看着比较直观,不难看出编译源文件的时候选用的是arm-linux-gcc和arm-linux-g++(切记版本一定要和制作FS的时候一致)特地找了个Cmake-gui编译的时候的图,一般都是terminal下cmake就好了,但是gui看着比较直观,不难看出编译源文件的时候选用的是arm-linux-gcc和arm-linux-g++(切记版本一定要和制作FS的时候一致)
configure 时 一般都是建立好 OpenCV的build目录和lib的生成目录,还有一些编译选项 ,例如 WITH_CUDA WITH_TIFF 等等
Generate 生成OpenCV的Makefile以后 就可以进入到build的目录下 make 源码 make install生成.so 和.a文件了。(这个过程还是需要点时间的,所以最好确保编译选项选的合适,否则反反复复也比较折腾的)
这个时候编译好的库文件有多种方法可以让ARM板子上Linux使用(列3中)
1,copy to U盘 ,板子如果可以有USB接口,可以mount U盘即可,再把U盘mount到Linux /lib下
2,NFS 同样通过这个可以mount到/lib下
3,Linux根文件系统在制作的时候我们一般留有 一个 -rwx的/tmp目录,tftp将这些 库文件copy到板子上,在/tmp 目录下建立 /tmp/lib 将 /lib 目录下的原来的库文件 copy to /tmp/lib,再将 OpenCV的库文件copy to /tmp/lib 最后 mount /tmp/lib 到/lib 这样就可以保证Linux可以使用OpenCV的库文件了

以上一般都是自己学习研究过程的做法,如果是APP层到kernel 都比较成熟的话 可以将kernel uImage 和 fs 和 APP 同时打包 一同烧录到board 上就可以了, 即整个系统分为 boot + 打包的img

------------------------------------------------------------------------------------------------------------
以上基本上可以说 你可以运行需要OpenCV 的第三方库的软件 需要环境已建立
APP层就可以有多种多样的,对于ARM9上的APP那就不好说了,正如 @chen jason说的一样,这个跑起来就是基本上是萎的
拿一个例子来说吧
stereo_calibration:摄像头标定
当然 编译也当然要在宿主机上编译(当然现在有的board可以带编译器) compiler版本要准确 -I 加上OpenCV的include -L OpenCV所需库文件和其他的库文件 编译生成的文件 应该就是可以再board上跑的

<img src="https://pic4.zhimg.com/09c073a225087f1d6cad98f30546c5b7_b.png" data-rawwidth="553" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="553" data-original="https://pic4.zhimg.com/09c073a225087f1d6cad98f30546c5b7_r.png">这个应该很熟悉的 :LEFT000这个应该很熟悉的 :LEFT000
<img src="https://pic2.zhimg.com/87ac319ce38400f7aaa4add5b8f68ab5_b.png" data-rawwidth="547" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="547" data-original="https://pic2.zhimg.com/87ac319ce38400f7aaa4add5b8f68ab5_r.png">:RIGHT000:RIGHT000
执行成功后生成摄像头内外参数文件,intrinsics.yml,extrinsics.yml 两个文件,在立体匹
配的参数输入

stereo_math 这个源文件也需要和stereo_clib同样编译 将以上的camera的内外参
intrinsics.yml,extrinsics.yml 放到改可执行文件的相同目录下
先看我们需要match 的两个图
<img src="https://pic4.zhimg.com/e924c9e409e7a7540dbfd1824b6820b7_b.png" data-rawwidth="551" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="551" data-original="https://pic4.zhimg.com/e924c9e409e7a7540dbfd1824b6820b7_r.png">
--------------------------------------------------------------Left:------------------------------------------------------------------
<img src="https://pic4.zhimg.com/a26022d08ab4ae87d1c50595b913470b_b.png" data-rawwidth="552" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="552" data-original="https://pic4.zhimg.com/a26022d08ab4ae87d1c50595b913470b_r.png">
--------------------------------------------------------------------Right--------------------------------------------------------
结果::::::结果:::::结果::::
深度图:视差图
<img src="https://pic4.zhimg.com/a5ae194a189c4fc7ffbe7b73c8065eb3_b.png" data-rawwidth="320" data-rawheight="271" class="content_image" width="320">
明显这个噪声和误差不是一般的大
这个原因有很多种:最容易想到的是摄像头不怎么好,当时用的就是普通的web camera,还有标定的时候我看到动了位置和距离(大家应该都了解 Linux2.6.26内核是不支持同时打开1个以上的camera的:因为内核就只允许初始化一个camera dev),所以我就一个摄像头拍完,USB接口取下来,另一个插上去 ,虽然插拔过程中没有动过摄像头,但是可能也有少许有的吧

这个match过后还会生成一个 point.xyz的文件,这个应该都知道干嘛的吧 ,就是 PCL(point cloud library) 点云库 工业机器人上应该用的比较多,也就是说xyz文件就是当前算出来的立体空间的三维坐标,也就是可以模拟出来三维空间。


至于OpenCV大概就是这样,虽然吐图像效果可以说是没有,但是至少arm还是可行的,到时是arm芯片当然是越高档越好。
至于这个项目:当初老师说最终还是走gpu CUDA,目标是坐在多旋翼无人机上,进行地理勘测的。这个arm给我试试看来着;我毕业后也没有在追过,我也就是兴趣爱好探究一下,希望对大家有点帮助,多谢各位大神指教,恕不邀自来,O(∩_∩)O哈哈~
0 0