暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【经验分享】x86、aarch64、arm32环境编译/交叉编译opencv方法

极智视界 2021-08-19
8600

       本教程详细记录了在ubuntu1804中源码编译/交叉编译x86版本、华为atlas500系列aarch64版本、华为海思Hi35xx系列ARM32版本opencv的方法。至此集齐了x86、arm64、arm32三种环境编译/交叉编译opencv的方法。

        相关教程我也记录在了我的博客里,传送门:

         x86:

https://blog.csdn.net/weixin_42405819/article/details/117931668?spm=1001.2014.3001.5501
【走过一个坑】ubuntu源码编译opencv

        aarch64:

https://blog.csdn.net/weixin_42405819/article/details/118058173?spm=1001.2014.3001.5501
【走过一个坑】华为atlas500系列aarch64交叉编译opencv

         arm32:

https://blog.csdn.net/weixin_42405819/article/details/117996788?spm=1001.2014.3001.5501
【走过一个坑】华为海思Hi35xx系列ARM32交叉编译opencv


一 、x86环境编译opencv

1、安装cmake及依赖库

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


      errorE: unable to locate libjasper-dev


      sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
      sudo apt update
      sudo apt install libjasper1 libjasper-dev


      2、下载源码包

        opencv 官网下载链接:https://opencv.org/releases/


        下载指定版本的源码包 source 即可。


        这里以opencv3.4.0为例。



      3、开始编译

        cd opencv-3.4.0
        mkdir build
        cd build
        sudo cmake -D WITH_TBB=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D CMAKE_INSTALL_PREFIX=/path/to/opencv ..
        sudo make -j8
        sudo make install -j8


        • 若cmake要指定python3,确定/usr/bin/python指向你的python3,则:


          cmake -D WITH_TBB=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python -D CMAKE_INSTALL_PREFIX=/path/to/opencv ..


          4、配置opencv环境变量

            vim ~/.bashrc

              加入:

              export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/path/to/opencv/lib/pkgconfig
              export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/opencv/lib


                使环境生效:

                source ~/.bashrc
                sudo ldconfig



                5、查看是否安装成功

                  # 输出opencv版本
                  pkg-config opencv --modversion
                  # 输出opencv库,通过pkgconfig配置
                  pkg-config opencv --libs




                  二 、aarch64环境交叉编译opencv

                  1、编译环境

                  atlas500 的板子需要aarch64版本的opencv,我的编译环境是ubuntu1804服务器上使用编译工具链g++-aarch64-linux-gnu进行交叉编译。与atlas500交互开发可采用nfs搭建,可参考我之前写过的一篇昇腾的板子交互开发配置的教程:

                  https://blog.csdn.net/weixin_42405819/article/details/117294542?spm=1001.2014.3001.5501
                  【嵌入式AI】atlas500与虚拟机ubuntu交互配置


                  2、资料包下载

                  opencv下载网址:https://opencv.org/

                  Aarch64 Linux编译工具链如下:

                  sudo apt install g++-aarch64-linux-gnu

                             

                  3、交叉编译

                  cd opencv
                  mkdir build
                  cd build

                  新建文件 aarch64-linux-gnu.cmake,在里面添加如下内容(相关路径根据实际设置)。

                   SET(CMAKE_SYSTEM_NAME Linux) 
                  SET(CMAKE_SYSTEM_PROCESSOR aarch64)
                  SET(CMAKE_C_COMPILER   "aarch64-linux-gnu-gcc")
                  SET(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
                  SET(CMAKE_FIND_ROOT_PATH usr/aarch64-linux-gnu/bin)                    

                  生成makefile:

                  cmake .. -DCMAKE_TOOLCHAIN_FILE=./aarch64-linux-gnu.cmake -DCMAKE_INSTALL_PREFIX=./lib -DCMAKE_INSTALL_INCLUDEDIR=./include -DCMAKE_BUILD_TYPE=Release -DBUILD_JPEG=ON -DWITH_1394=OFF -DWITH_GTK=OFF

                  编译:

                  make -32
                  make install -j32



                  三 、arm32环境交叉编译opencv

                  1、编译环境

                  海思Hi35xx的板子需要ARM32位的opencv,我的编译环境是ubuntu1804服务器上使用 arm-himix200-gcc编译器进行交叉编译。与海思交互开发同样可采用nfs搭建。


                  2、资料包下载

                  opencv下载网址:https://opencv.org/

                  用到的海思编译工具链包如下(搞不到资源的可以联系我)


                  3、交叉编译

                  首先安装海思交叉编译工具链:

                  ./arm-himix200-linux.install

                  开始交叉编译:

                  tar xzvf opencv-3.4.6.tar.gz 
                  mkdir hisi_build
                  cd hisi_build

                  新建文件 arm-himix200.camke
                  ,在里面添加如下内容(相关路径根据实际设置)

                  SET(CMAKE_SYSTEM_NAME Linux)  
                  SET(CMAKE_CXX_COMPILER arm-himix200-linux-g++)
                  SET(CMAKE_C_COMPILER arm-himix200-linux-gcc)
                  SET(CMAKE_FIND_ROOT_PATH opt/hisi-linux/x86-arm/arm-himix200-linux/bin)

                  生成makefile

                  cmake .. -DCMAKE_TOOLCHAIN_FILE=./arm-himix200.cmake -DCMAKE_INSTALL_PREFIX=./lib -DCMAKE_INSTALL_INCLUDEDIR=./include -DCMAKE_BUILD_TYPE=Release -DBUILD_JPEG=ON -DWITH_1394=OFF -DWITH_GTK=OFF
                  sudo make 
                  sudo make install


                  进入报错集锦

                  报错集锦  第三位

                  opencv-3.4.6/3rdparty/libpng/pngstruct.h:30:18: fatal error: zlib.h: No such file or directory

                  解决方法

                  修改 opencv-3.4.0/3rdparty/libpng 下的 CMakeLists.txt

                  在 ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" ${ZLIB_INCLUDE_DIRS}) 前添加

                  set(ZLIB_INCLUDE_DIRS "/home/share/opencv/opencv-3.4.0/3rdparty/zlib/") 注意修改上面路径。清除cmake,然后重新cmake & make 可能还有其他类似以上报错,处理方式一样。


                  报错集锦  第二位

                  undefined reference to `gzeof'

                  undefined reference to `_dl_hwcap'

                  undefined reference to `_dlopen' 等

                   【解决方法

                  CMakeCache.txt 中找到:添加 -lpthread -lrt -lz -ldl,意思是编译的时候把这些库链接进来:

                  CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt -lz -ldl


                  报错集锦  第一位

                  undefined reference to `inflateValidate'

                  解决方法

                  在交叉编译opencv前,需要交叉编译ARM32位的 zlib 和 libpng,方法看下面。

                  编译器是arm-himix200-linux-gcc,编译libpng前,需要先编译zlib库。

                  zlib库下载地址http://www.zlib.net/

                  下载zlib-1.2.11.tar.gz,解压后,得到zlib-1.2.11

                  cd zlib-1.2.11 
                  export CC=arm-himix200-linux-gcc 它的configure不支持用CC变量来指定交叉工具链

                  ./configure --prefix=/opt/hisi-linux/x86-arm/arm-himix200-linux/zlib
                  sudo make
                  sudo make install

                  之后下载libpng源码,地址:https://sourceforge.net/projects/libpng/files/libpng16/1.6.36/

                  下载libpng-1.6.36.tar.gz,解压后,得到libpng-1.6.36

                  cd libpng-1.6.36 

                  ./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux CFLAGS=-I/opt/hisi-linux/x86-arm/arm-himix200-linux/zlib/include LDFLAGS=-L/opt/hisi-linux/x86-arm/arm-himix200-linux/zlib/lib --prefix=/opt/hisi-linux/x86-arm/arm-himix200-linux/libpng

                  此时还需要修改Makefile,把zlib的路径加进去

                  vi Makefile

                  在DEFAULT_INCLUDES = -I.下面再加一句

                  DEFAULT_INCLUDES += -I/opt/hisi-linux/x86-arm/arm-himix200-linux/zlib/include
                  sudo make 
                  sudo make install

                  之后到安装目录,就可以看到编译出来文件。

                  然后把刚才生成的两个库的lib 都拷贝到 /opt/hisi-linux/x86-arm/arm-himix200-linux/arm-linux-gnueabi/lib。

                          收工~


                  声明:转载请说明出处

                  扫描下方二维码关注【极智视界】公众号,获取更多实践项目资源和读书分享,让我们用极致+极客的心态来迎接AI !

                  文章转载自极智视界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论