开发环境: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。
sudo docker export 563b64aaba39 > /mnt/hgfs/shared/rootfs.tar.gz
这样就导出了配置好的根文件系统,解压到SD卡就可以用了