本帖最后由 流行科技 于 2023-11-27 20:13 编辑
一.前言 从网上来说,目前讲交叉编译OpenCV的很多,但是有些时候会有很多问题,我搭建的时候找了很多案例有些都有问题,试错多次后,决定还是要总结下,记录下本次编译出现的各种问题。 二.搭建交叉编译环境 首先说明下,我使用的系统是鲁班猫的debian10系统镜像,是原来出厂就刷入的系统。所以我们直接在鲁班猫的资料中,找QT教程下对应的debain10下的gcc工具链,这个复制到我们的虚拟机中。 我放到了虚拟机中的opt目录下。位置只要自己知道既可。 三.下载源码 如上图选择sources既可下载。还有一个比较重要的东西,就是OpenCV的很多模块都在OpenCV-Contrib里面,所以还需下载其对应的其他模块版本。 四.全部复制到一个文件夹下,交叉编译,确定自己需要的模块。 首先我是在home下建立我们的opencv文件夹,把下载好的两个文件都放进去然后我们去分别解压两个文件,两个文件是不需要合并的。 sudo apt-get install cmake cmake-qt-gui cmake-curses-gui 安装cmake工具,这个肯定要的,我选择还安装他的图形化工具,图形化工具更加的直观一点。 然后在opencv目录下新建两个文件,一个是构建MakeFile的,一个是交叉编译好之后安装库和头文件的路径。 然后命令行启动cmake-gui。 首先就是这四个设置,第一个是我们opencv的路径,第二个是我们选择的build路径,第三个都勾选上,方便查看每个下面的模块。第四步会有弹窗如下。 指定我们交叉编译工具链。 第一个必须是Linux的拼写,不是小写首字母,linux这样的,还有教程说arm-linux的,还有aarch64-linux。我试了在这个版本下opencv库里必须是Linux其他的都是有问题的,而且很难解决,可能你编译的不需要外部的模块,不受影响,一旦需要外部模块记住只能是Linux。 第二就是选择我们的编译器目录下的gcc交叉编译器,第三是g++。第四个可以选择交叉编译器的目录,也可以选择其他交叉编译模块的目录,添加模块后面涉及交叉编译其他的库,以及其他一些问题,这里先简要概括下,后面专门介绍增加模块。 第五块,按照我们的设置的来既可。第六点击finish既可。 上面的爆红先不管,看下面的,按照我设置的Linux名称底下的信息中就很少会有报错信息。设置其他名称都有很多问题。上面爆红只需再次点击下configure既可。 再次点击,就全消失了,下面就是把一些路径修改掉,加上去除一些库。 我们可以通过找每个模块修改,也可以是搜索对应的东西去修改。首先就是这个构建完成后安装路径修改成为我们创建的arm-install路径,如下: 然后就是修改opencv的modules路径,这个包含很多模块,所以如果是不需要就不添加,添加了也会引起很多问题。我们添加上,因为在这个模块基础上我们还需要很多其他模块。 注意到后面的位置是引用到了modules路径上,不是他的根目录下。 再次的configure添加完会有一些报错,这是下载东西连接不上,不用管他。第二个是上面新增的一些东西。 再添加编译是链接的一些参数-lpthread -lrt -ldl。-lpthread支持线程,-ldl避免未定义dlopen,-lrt避免未定义 目前应该还有些库没找到,所以我们先只去掉一个gtk既可,gtk是交叉编译中基本完成不了的,他是用来显示的,我们用他内部的一些显示函数,他直接出一个类似于win下桌面应用程序一样的东西,这个支持不了在arm下,一般会通过with_qt来解决这个问题。目前到这里就可以点击generate了,生成我们的MakeFile。 生成后直接到目录下make。遇报错再解决。 五.报错和解决 - undefined reference to `png_init_filter_functions_neon'
复制代码- /3rdparty/libpng/pngpriv.h
- /*# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/
- # if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
- opencv_contrib-3.4.5/modules/xfeatures2d/src/vgg.cpp:490:20: fatal error: vgg_generated_120.i: No such file or directory
- #include "vgg_generated_120.i"
复制代码- boostdesc_bgm.i
- boostdesc_bgm_bi.i
- boostdesc_bgm_hd.i
- boostdesc_lbgm.i
- boostdesc_binboost_064.i
- boostdesc_binboost_128.i
- boostdesc_binboost_256.i
- vgg_generated_120.i
- vgg_generated_64.i
- vgg_generated_80.i
- vgg_generated_48.i
复制代码
把上述文件放置在上述指定路径下后,make重新编译即可 - opencv-3.4.5/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:12: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
- # include "opencv2/xfeatures2d/cuda.hpp"
复制代码
在/home/src/software/opencv-3.4.2/modules/stitching/CMakeLists.txt中加入 - INCLUDE_DIRECTORIES("/home/src/software/opencv-3.4.2/opencv_contrib-3.4.2/modules/xfeatures2d/include")
复制代码根据报错信息,打开/home/src/software/opencv-3.4.2/modules/stitching/include/opencv2/stitching/detail/matchers.hpp文件,将52行 - #include "opencv2/xfeatures2d/cuda.hpp"
复制代码替换成 - #include "/home/src/software/opencv-3.4.5/opencv_contrib-3.4.5/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"
复制代码六.测试 出现上面的100%提示就意味着我们的编译完成了,接下来就是创建板子工程进行测试。 看下我们安装后的文件列表吧。 这些都是我们编译好的目录下的文件。 在鲁班猫上进行创建QT工程。 所有都默认既可。
拉出来一个label控件,重新命名。
然后通过scp命令把我们的库文件全部传到板子上。 然后再pro文件中添加库和头文件位置声明,建议库用到啥添加啥。 看下我们工程里面的文件。
然后运行一个简单的案例,就是通过Mat转换下,在QT label里面显示一个图片。
|