OpenCV编译选项配置

借用一句网友的话,编译OpenCV顺利的话半天,不顺利的话至少一天(手动狗头)。
我花了两天时间完成了x86 Ubuntu的OpenCV编译和Android NDK OpenCV的交叉编译,在这里记录一下相关配置选项。

编译x86版本OpenCV

本人使用系统为Ubuntu-18.4.06,GCC G++ 7.5.0, CMAKE 3.20,首先安装编译所需要的库:

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev

如果有提示缺少其他依赖,对应安装即可。
创建Install build目录。

# 在 opencv4.5.4源码解压后的文件夹下面,创建编译文件夹
cd build
rm -r *

# 配置编译选项
# CMAKE_INSTALL_PREFIX: 是最终OpenCV的安装位置,可以自行修改安装位置
# OPENCV_ENABLE_NONFREE:指示是否开启Non-free的算法
# OPENCV_EXTRA_MODULES_PATH: 指示扩展算法的源码文件夹,指向contrib模块下载解压后的路径即可
# WITH_CUDA: 该选项需要确保自己已安装显卡驱动和cuda
# 可以关注下命令的输出,可以从中找到哪些模块没有配置成功
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=~/opencv-4.5.4/install/ \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D OPENCV_EXTRA_MODULES_PATH=~/opencv-4.5.4/contrib/opencv_contrib-4.5.4/modules \
      -D OPENCV_GENERATE_PKGCONFIG=YES \
      -D WITH_QT=ON \
      -D WITH_OPENGL=ON \
      -D WITH_CUDA=ON \
      -D BUILD_EXAMPLES=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=ON \
      -D BUILD_TIFF=ON ..                #编译到tiff时会报错,由于系统TIFF5与OpenCV需要的版本4不一致,这里让OpenCV自己编

# 开启12个线程同时编译源码
make -j12

# 安装OpenCV到指定位置
make install

关于tiff相关报错提示一点,网上有资料说可以:

sudo apt remove libtiff5-dev
sudo apt install libtiff5-dev

千万不要这么做,当你remove后会发现系统已经崩了,一切得回到最开始的地方。。。
(这里我没有尝试,不一定会崩,但是在stackoverflow里面看到有人指出这个,特意把这个注意点搬到CSDN,建议大家不要轻易尝试。我之前吃过升级libc.so版本的亏,见识到了整个系统全乱是什么感觉~)

编译Android版本OpenCV

使用NDK r21e, armv8, android-24,按照如下方式:

cd build  
rm -r *
ANDROID_NDK=~/Downloads/android-ndk-r21e/
cmake \
-DANDROID_NATIVE_API_LEVEL=android-24 \
-DANDROID_ABI=arm64-v8a \
-DANDROID_LINKER_FLAGS="-Wl,-rpath-link=~/android-ndk-r21e/sysroot/usr/lib/aarch64-linux-android" \
-DCMAKE_BUILD_TYPE=RELEASE \
-DANDROID_STL=c++_shared  \
-DBUILD_opencv_videoio=OFF \                    
-DBUILD_ZLIB=ON \
-DWITH_FFMPEG=OFF \
-DWITH_OPENMP=ON \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_EXAMPLES=OFF \
-DBUILD_ANDROID_EXAMPLES=OFF \
-DBUILD_ANDROID_PROJECTS=OFF \
-DWITH_OPENCL=ON \
-DWITH_OPENCL_SVM=ON \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=~/opencv-4.5.4/opencv-out \
-DOPENCV_DISABLE_FILESYSTEM_SUPPORT=ON \
..

make -j8
make install

videoio子模块没有编译,该子模块是在板端处理音频视频等接口,如果需要编译,需要先自行编译FFmpeg,然后修改OpenCV相关路径配置,否则会出现一堆的未定义如:

libopencv_videoio.so: undefined reference to `AMediaExtractor_selectTrack'
libopencv_videoio.so: undefined reference to `AI_format'
...

openmp编译用于CPU多线程,opencl编译用于平台异构, zlib需要重新编译,否则会提示libz.soxxxx无法正常链接,从而出现一堆“未定义xxx”。