OpenCV交叉编译环境搭建

前言

初学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……

后记

本人菜鸟,此文仅提供了一种思路,大神请莫见笑……

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值