本教程详细记录了在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 cmakesudo 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-devsudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"sudo apt updatesudo apt install libjasper1 libjasper-dev
2、下载源码包
opencv 官网下载链接:https://opencv.org/releases/
下载指定版本的源码包 source 即可。
这里以opencv3.4.0为例。
3、开始编译
cd opencv-3.4.0mkdir buildcd buildsudo cmake -D WITH_TBB=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D CMAKE_INSTALL_PREFIX=/path/to/opencv ..sudo make -j8sudo 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/pkgconfigexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/opencv/lib
使环境生效:
source ~/.bashrcsudo 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=OFFsudo 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 !






