前言 
初学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……  
后记 
本人菜鸟,此文仅针对初学者,大神请莫见笑…… 
                
                
                
        
        
    
 
 |