General Purposes: Why I wrote this?
这几天在 Firefly RK3399 上部署需要 OpenCV 3.2.0 扩展版本的算法 Demo 。在Ubuntu 18.04 x86 架构下编译 OpenCV 3.2.0 + Contrib 比较容易,因此开发调试过程中没有什么问题,但是在 Firefly RK3399 上编译就出现了许多问题,我猜可能是因为 Contrib 库对系统的自带库很有版本依赖性,故此记录。这里先备注一下 Firefly RK3399 上的系统信息:
firefly@firefly:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Firefly 原装的 Ubuntu 应当是 16.04,但是后来由于同事对其进行了统一的系统升级,因此全部切换成了 18.04,如果用 apt install
进行 OpenCV 安装,对应版本应当是 3.2.0。因此我选用 OpenCV 3.2.0 + Contrib 源码在 Firefly 进行编译。
Compiling Details: How I successfully compiled Opencv3.2.0+contrib?
Required Packages
首先我们使用 apt install
安装一些必要的依赖库:
firefly@firefly:~$ sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
以上库都是基本上必须的。
Optional Packages
以下依赖库不是必须但是可选:
firefly@firefly:~$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
Compile Option Settings
我们假设已经下载了正确的 OpenCV 3.2.0 + Contrib 源码包,可以从 OpenCV 官方 GitHub 以及 OpenCV Contrib 官方 GitHub 获取。
编译选项如下:(这里要注意Python版本、contrib 目录位置等等,请依据真实情况选择)
特别补充: 这里我选择的 Python 接口是 Python3.6.9,因此我事先安装了 python3-pip、Cython、numpy。
firefly@firefly:opencv-3.2.0/build/$ cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DPYTHON_EXECUTABLE=$(which python3) \
-DPYTHON_NUMPY_INCLUDE_DIRS=/home/firefly/.local/lib/python3.6/site-packages/numpy/core/include/ \
-DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \
-DPYTHON_INCLUDE_DIR2=/usr/include/aarch64-linux-gnu/python3.6m \
-DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
../
firefly@firefly:OPENCV/build/$ make -j$(nproc --all)
firefly@firefly:OPENCV/build/$ sudo make install
Errors Unblock: How I unblock these errors?
这次编译遇到的最大的问题是:
//usr/lib/aarch64-linux-gnu/libatk-1.0.so.0: undefined reference to 'g_log_structured_standard'
//usr/lib/aarch64-linux-gnu/libgio-2.0.so.0: undefined reference to 'g_build_filename_valist'
可以搜到的最接近的问题可以参考如下:StackOverflow。问题原因:有个旧版本的glib不提供所示的函数实现,因此需要更新glib的链接。
# Some Useful Scripts:
pkg-config --modversion glib-2.0
pkg-config --cflags --libs glib-2.0
grep -l g_log_structured_standard /usr/lib/aarch64-linux-gnu/*glib*.so*
Summary: What I have done?
其实通篇看来也没做啥,主要就是成功在安装了 Ubuntu 18.04 的 Firefly RK3399 上成功编译了 OpenCV 3.2.0 + Contrib。其实在使用中还是有一些问题的,毕竟 contrib 库还是不如 core 稳定啊。有什么问题还望广大专家读者不吝斧正!