采用 Docker 和 qemu-user-static 交叉编译 opencv、opencv_contrib

开发环境:Ubuntu18.04 虚拟机

工具软件:docker-io、debootstrap、qemu-user-static、qemu-system

软件包:已打包好的根文件系统 rootfs.tar.gz 

 

1、安装工具软件:

sudo apt-get install docker-io、debootstrap、qemu-user-static、qemu-system

 

2、导入docker镜像,开启docker:

sudo docker import rootfs.tar.gz rootfs/debian

然后通过 docker images 命令,可以查看到已导入的镜像:

sudo docker run  -it -v /mnt/hgfs/shared:/mnt rootfs/debian:latest /bin/bash

其中,/mnt/hgfs/shared 表示挂载的主机目录,/mnt  表示docker的目录,两者必须用冒号 “:” 隔开。

通过 docker ps -a 命令,可以查看到已经启动过的docker(我多次启动和退出,显得有点乱了)

 

3、编译opencv、opencv_contrib(我进入docker后直接是超级用户,所以不需要切权限)

首先,下载opencv和与其匹配的opencv_contrib并解压,两个文件夹位于同级目录下。然后在opencv目录下创建 build/ 文件夹,存放编译过程中生成的中间文件。另外,opencv下载方式多种多样,仅提供github一种(可以在主机上下载好,然后拷贝到docker中):

git clone https://github.com/Itseez/opencv.git

git clone https://github.com/Itseez/opencv_contrib.git

其次,安装必要的库(由于我用的是 armhf 的Debian系统,所以,一些软件可以直接通过apt-get安装)

apt-get install build-essential
apt-get install cmake git libgtk2.0-dev libgtk3.0 pkg-config libavcodec-dev libavformat-dev libswscale-dev
apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
apt-get install libavresample3 gstreamer-base-1.0

再次,命令行配置opencv 和 opencv_contrib(采用默认配置吧,仅指定了CMAKE_BUILD_TYPE和OPENCV_EXTRA_MODULES_PATH,反正更复杂的配置我也不会):

cmake -DCMAKE_BUILD_TYPE=Release -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..
最后,编译、安装opencv和opencv_contrib:

make

make install

在编译opencv、opencv_contrib的过程中,可能会出现了如下错误:

1)缺少 boostdesc_bgm.i 等文件

opencv_contrib-4.2.0/modules/xfeatures2d/src/boostdesc.cpp:654:37: fatal error: boostdesc_bgm.i: No such file or directory
           #include "boostdesc_bgm.i"
 

解决方法:

从 CMakeDownloadLog.txt 文件中找到相应的文件下载链接,把文件下载后放到opencv_contrib-4.2.0/modules/xfeatures2d/src 目录下即可。我已经把这些文件下载并上传,附链接: xfeatures2d.rar

 

2)编译xfeature2d/test 缺少头文件:

opencv_contrib-4.2.0/modules/xfeatures2d/test/test_features2d.cpp:51:62: fatal error: features2d/test/test_detectors_regression.impl.hpp: No such file or directory
 #include "features2d/test/test_detectors_regression.impl.hpp"

opencv_contrib-4.2.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp:7:82: fatal error: features2d/test/test_detectors_invariance.impl.hpp: No such file or directory
 #include "features2d/test/test_detectors_invariance.impl.hpp" // main OpenCV repo

opencv_contrib-4.2.0/modules/xfeatures2d/test/test_detectors_invariance.impl.hpp:5:37: fatal error: test_invariance_utils.hpp: No such file or directory
 #include "test_invariance_utils.hpp"
 

解决方法:

A: 把如下文件拷贝到相应目录(当前目录为:opencv-4.2.0/build,opencv_contrib与opencv-4.2.0在同级目录)

opencv-4.2.0/build# cp ../modules/features2d/test/test_descriptors_regression.impl.hpp ../../opencv_contrib-4.2.0/modules/xfeatures2d/test/
opencv-4.2.0/build# cp ../modules/features2d/test/test_detectors_regression.impl.hpp ../../opencv_contrib-4.2.0/modules/xfeatures2d/test/    
opencv-4.2.0/build# cp ../modules/features2d/test/test_detectors_invariance.impl.hpp ../../opencv_contrib-4.2.0/modules/xfeatures2d/test/
opencv-4.2.0/build# cp ../modules/features2d/test/test_descriptors_invariance.impl.hpp ../../opencv_contrib-4.2.0/modules/xfeatures2d/test/   
opencv-4.2.0/build# cp ../modules/features2d/test/test_invariance_utils.hpp ../../opencv_contrib-4.2.0/modules/xfeatures2d/test/ 
B:把 opencv_contrib-4.2.0/modules/xfeatures2d/test/test_features2d.cpp 中的:

 #include "features2d/test/test_detectors_regression.impl.hpp" 改为  #include "test_detectors_regression.impl.hpp"

 #include "features2d/test/test_descriptors_regression.impl.hpp" 改为  #include "test_descriptors_regression.impl.hpp"

把 opencv_contrib-4.2.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp 中的:

 #include "features2d/test/test_detectors_invariance.impl.hpp" 改为  #include "test_detectors_invariance.impl.hpp"

 #include "features2d/test/test_descriptors_invariance.impl.hpp" 改为  #include "test_descriptors_invariance.impl.hpp"

4、提交和导出镜像:

已经编译好opencv的docker镜像,退出以后需要提交修改,然后可以看到产生的新镜像。

sudo docker commit -m "save qt" 563b64aaba39 

其中,563b64aaba39  为已修改镜像的 IMAGE_ID。

采用 Docker 和 qemu-user-static 交叉编译 opencv、opencv_contrib_第1张图片

 

sudo docker export 563b64aaba39  > /mnt/hgfs/shared/rootfs.tar.gz

这样就导出了配置好的根文件系统,解压到SD卡就可以用了

 

 

你可能感兴趣的:(开发环境搭建)