前言

最近项目需要在arm平台上去调用opencv的一些接口,所以这里讲解一下如何将opencv移植到arm平台,对于其他源码的一些交叉编译以及移植有一些帮助和理解。


一、opencv是什么?

OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库.

自己对它的看法:
首先那肯定就是加快开发速度,意味着一些图像处理你不需要自己调用opencv的接口你能很轻松的实现你想做的图像处理,但是这毕竟是开源库,也就意味着你如果想提升性能或者更灵活更细节,你需要自己去改动这个库的某些实现。


`

二、怎么安装成自己想要的

1.拿到源码

因为无论任何平台下,源码肯定是都是一样的:
在这里插入图片描述
这里我用的是opencv-3.4.1.tar.gz,这个源码到处都有,实在找不到的可以找我要。
然后 tar xf opencv-3.4.1.tar.gz 解压
进入目录下


`

用cmake-gui进行配置

这是我推荐的方式,因为gui方式就像内核的Menuconfig,这样的配置方式很直观而且查看各种config也很简单,那么我们首先得知道什么是cmake-gui,什么是cmake,gui的意思我相信大家都知道,就是可视的界面嘛,你进入opencv源码也能看见源码目录下有cmake目录。

首先我们要理一理我们编译很多东西,这些操作要总结,总结了你就不是看看别人博客照猫画虎,而是知道别人在干嘛,为什么这么干,内核,Uoot,qt,我们都需要什么,或者更直接地说我们make需要什么,makefile啊!那肯定的啊,都什么时代了,难道工程还是arm-linux-gcc -o?(单个文件倒是可以),难道还是keil那种IDE手指轻轻一点???肯定不是的,我们需要强大的make以及它的规则makefile,所以我都大概能猜到后面cmake-gui这种工具是拿来干嘛的。

cmake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

根据CMakeLists.txt生成Makefile文件
执行Makefile文件,编译程序,生成可执行文件

但是别高兴的太早,CmakeLists.txt有在这里插入图片描述
1496行,是不是笑容逐渐消失,是的,这意味着直接去修改CMakeLists是应该容易出错的,或者说门槛比较高的,你首先得弄懂它的语法是怎么回事儿,这离我们最开始的目标,可以说就走远了。

cmake-gui

所以有了cmake-gui,就好比自己之前移植内核,一个一个文件夹下面去改makefile,最后还容易出问题,弄的头大,但是有了menuconfig,那瞬间就仿佛打开了新大门,cmake-gui也是也样的,用勾选和不勾选的方式你就能搭建你自己想要的配置方式,而且搜索也十分方便,这就是为啥一般人到了源码要去mkdir两个目录,一个是xxx_build,用了生成配置文件以及构建,你可以配置你的编译器,你的Install目录,你要编译源码的那些部分,一个目录是xxx_install目录,这个目录下就会生产我们需要的动态库文件,这些文件是对应着相应的build的生成的,就可以支持你其他环境下应用环境的运行(比如我们所要移植的arm平台)

附安装命令: sudo apt-get install cmake cmake-qt-gui cmake-curses-gui



配置

https://blog.csdn.net/Guet_Kite/article/details/78667175这个兄弟写的挺好的
我就提醒几点
第一就是说在这里插入图片描述
这个可以在cmake-gui修改,不用后面去文件里改
修改它是为什么?
通过这个宏我们大概可以知道,这个链接阶段的一个flag,-lpthread,一看就是线程相关的,有一些多线程的支持,链接pthread库,链接到一些一看还真是,只不过看了很多资料最后得知最好是-pthread,两点:(这是出自其他博客大神的解释,也是给我解惑了)

1、-lpthread是较为老式的解决方法,pthread新加了对于宏D_REENTRANT的定义,-pthread会被展开为“-D_REENTRANT -lpthread”,它不仅可以链接pthread库,还可以打开系统头文件中的各种多线程支持分支,比如,我们常常使用的错误码标志errno,如果没有定义_REENTRANT,则实现为一个全局变量;若是定义了_REENTRANT,则会实现为每线程独有,从而避免线程竞争错误。

2、-pthread可移植性较强:在Linux中,pthread是作为一个单独的库存在的(libpthread.so),但是在其他Unix变种中却不一定,比如在FreeBSD中是没有单独的pthread库的,因此在FreeBSD中不能使用-lpthread来链接pthread,而使用-pthread则不会存在这个问题,因为FreeBSD的编译器能正确将-pthread展开为该系统下的依赖参数。同样道理,其他不同的变种也会有这样那样的区别,如果使用-lpthread,则可能在移植到其他Unix变种中时会出现问题,为了保持较高的可移植性,我们最好还是使用-pthread(尽管这种做法未被接纳成为C标准,但已基本是事实标准)

-lrt
-lrt 实时库(real time),也是在链接阶段加入库文件,因为线程那边会用到,也就是说之前我们的-pthread如果用到了,最好加上-lrt

-ldl:显式加载动态库的动态函数库
如果你的程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项 -ldl

这儿我们可以看出。-lxx其实就是加入某个库,为什么需要加入呢,因为你的源码中用到了–笑脸。


第二个
在这里插入图片描述
这是错误的,上面博客的博主也说了,也是我后面遇到的坑,这个名字是不能随便写的,Linux大小写敏感,不然后面是不支持V4L2的,是没这个选项,后面带来的就是,在Ubuntu上opencv 调用摄像头没问题,arm上是找不到摄像头的,它不知道怎么从/dev/video*去调用设备节点,当然我肯定是解决了,我自己写了v4l2的上层调用,因为我内核是支持V4L2的,最好规范,别自己找麻烦。

总结

总而言之,我们遇到问题,或者说处理任何问题,不要慌,先想自己干嘛,然后每一步去干嘛,做到相应的地方出现问题了,别慌这就是你成长的机会了,没有玄学的问题,只是你太菜了,哈哈哈

在这里插入附上图片描述
这个是生成的动态库的文件,最后一定记住,一定是对应的.so文件,比如我是arm的我readelf可以看到它的CPU架构等情况

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐