前言
初学OpenCV,在Ubuntu上可以用apt-get方便的解决编译依赖,OpenCV的编译过程较为顺利。但想在嵌入式arm板子上进行测试,编译则不这么顺利,特别是在解决依赖的问题上比较繁琐,如ffmpeg,网上也有很多案例和解决方法可供参考。
我个人追求极简主义(其实是懒……),既然目的仅仅是编译OpenCV,就尽量不要花太多时间去编译其他依赖库,以免本末倒置。在这描述一种借助buildroot构建解决所有编译依赖的方法。
编译buildroot
我个人比较习惯用buildroot去构建文件系统,因为buildroot上的package更新比较及时,在上面我几乎能找到所有我需要的package。同样的,OpenCV在buildroot中也有支持。其实,如果您对OpenCV的版本不敏感的话,那么直接用buildroot就完事了,全剧终……
不过,如果buildroot里的OpenCV的版本不是您想要的,或者您需要编译opencv_contrib(截稿前本人发现buildroot貌似默认不支持编译contrib,可能是由于专利原因吧……),那么就可以先在buildroot里将opencv选上,先整体编译一遍buildroot,这样buildroot就可以自动帮您解决所有编译依赖。
buildroot的编译不是本文重点,无非就是通过menuconfig选好target options、toolchain等,同时把opencv选上(在menuconfig中建议把所有的opencv相关选项都打开,这样可以更完整的编译依赖库),在此就不展开了。
编译OpenCV
完成buildroot编译后,就可以尽情享用它的成果了。编译OpenCV的流程在此也不展开,直接贴cmake配置(具体的cmake配置请按需添减):
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_TOOLCHAIN_FILE=<your path>/toolchainfile.cmake
-D BUILD_SHARED_LIBS=ON
-D CMAKE_INSTALL_PREFIX=<your path>/install
-D OPENCV_ENABLE_PKG_CONFIG=ON
-D BUILD_EXAMPLES=ON
-D BUILD_TESTS=ON
-D BUILD_PERF_TESTS=ON
-D BUILD_opencv_apps=ON
-D BUILD_WITH_DYNAMIC_IPP=OFF
-D BUILD_ITT=OFF
-D WITH_INTELPERC=OFF
-D WITH_IPP=OFF
-D WITH_IPP_A=OFF
-D WITH_TBB=OFF
-D OPENCV_EXTRA_MODULES_PATH=<your path>/opencv_contrib/modules
..
toolchainfile.cmake
在cmake配置中,指定了CMAKE_TOOLCHAIN_FILE,也是直接贴配置(具体的路径、arch、flags请按需修改):
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TOOLCHAIN_HOST_DIR “<your path>/buildroot/output/host”)
# Root path
set(CMAKE_PROGRAM_PATH “${TOOLCHAIN_HOST_DIR}/bin”)
set(CMAKE_SYSROOT “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)
set(CMAKE_FIND_ROOT_PATH “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(ENV{PKG_CONFIG_SYSROOT_DIR} “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)
# Compiler and flags
set(CMAKE_C_COMPILER “${TOOLCHAIN_HOST_DIR}/bin/arm-linux-gcc”)
set(CMAKE_CXX_COMPILER “${TOOLCHAIN_HOST_DIR}/bin/arm-linux-g++”)
set(CMAKE_C_FLAGS “-mfloat-abi=hard”)
set(CMAKE_CXX_FLAGS “-mfloat-abi=hard -Wno-psabi”)
buildroot/output/host
此路径就是buildroot帮我们解决所有依赖库所在的路径,用于指定CMAKE_PROGRAM_PATH、CMAKE_SYSROOT、CMAKE_FIND_ROOT_PATH、CMAKE_C_COMPILER、CMAKE_CXX_COMPILER、PKG_CONFIG_SYSROOT_DIR。
-Wno-psabi
在编译过程中如果出现大量如下warnings:
note: parameter passing for argument of type ‘__gnu_cxx::__normal_iterator<std::pair<int, double>*, std::vector<std::pair<int, double> > >’ changed in GCC 7.1
并且您的gcc版本大于7.1的话,则可在CMAKE_CXX_FLAGS中指定:
-Wno-psabi
我个人追求极简主义(其实是洁癖……),容不得半点warning。
(参考:what-does-the-gcc-warning-project-parameter-passing-for-x-changed-in-gcc-7-1)
make && make install
cmake配置成功后,查看log,您会发现之前常见的 ffmpeg 等的依赖根本不需要花时间去解决:
– Video I/O:
– DC1394: NO
– FFMPEG: YES
– avcodec: YES (ver 58.91.100)
– avformat: YES (ver 58.45.100)
– avutil: YES (ver 56.51.100)
– swscale: YES (ver 5.7.100)
– avresample: YES (ver 4.0.0)
– GStreamer: NO
– libv4l/libv4l2: NO
– v4l/v4l2: linux/videodev2.h
最后就是常规的 make 和 make install,感谢buildroot……
后记
本人菜鸟,此文仅提供了一种思路,大神请莫见笑……