前言
初学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选上,在此就不展开了。
编译OpenCV
完成buildroot编译后,就可以尽情享用它的成果了。编译OpenCV的流程在此也不展开,直接贴cmake配置:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=ON -D CMAKE_FIND_ROOT_PATH=<your path>/buildroot/output/host -D CMAKE_C_COMPILER=<your path>/buildroot/output/host/bin/arm-linux-gcc -D CMAKE_CXX_COMPILER=<your path>/buildroot/output/host/bin/arm-linux-g++ -D CMAKE_CXX_FLAGS="-mfloat-abi=hard -Wno-psabi" -D CMAKE_C_FLAGS="-mfloat-abi=hard" -D CMAKE_INSTALL_PREFIX=<your path>\install -D BUILD_ZLIB=ON -D BUILD_EXAMPLES=ON -D BUILD_TESTS=ON -D BUILD_PERF_TESTS=ON -D BUILD_opencv_apps=ON -D OPENCV_EXTRA_MODULES_PATH=<your path>/opencv_contrib/modules …
buildroot/output/host
此路径就是buildroot帮我们解决所有依赖库所在的路径,用于指定CMAKE_FIND_ROOT_PATH、CMAKE_C_COMPILER、CMAKE_CXX_COMPILER
-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)
BUILD_ZLIB
此选项最好也开启,因为如果关闭,则默认会在CMAKE_FIND_ROOT_PATH中搜索libz.so,但在buildroot的output/host路径下存在两个libz.so,一个是host的,一个是target的,在我的环境中,cmake配置过程会匹配上的host的libz.so,导致后续编译出错。因此开启此选项让OpenCV自己编zlib吧。
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
感谢buildroot……
后记
本人菜鸟,此文仅针对初学者,大神请莫见笑……
|