最近有个优化任务,需要在Hisi3559A的平台上运行应用,所以需要将OpenCV移植到该平台。虽然已经有很多人写过相关的东西,但感觉都不够详细或是有错误,下面记录一下自己移植的过程。
FFmpeg
需要提一下这个,因为我的应用不需要进行视频播放,所以这个模块我没有编译。
如有需要可以参考该博客的方式。
FFmpeg源码下载地址
OpenCV 2.4
因为3359A是基于ARM的平台,所以我先参考了官方的移植教程,但感觉对于我的帮助并不大。
在其他博客中上看到Building_OpenCV_for_ARM_Cortex-A8的文章,感觉还是挺有用的,我是基于篇文章进行的移植。
移植前需要安装一下cmake,用于配置OpenCV的工程。
下面的配置过程在Windows下同样适用,不过需要你找到Windows上的交叉编译工具链。
OpenCV 编译环境
Ubuntu 16.04
CMake 3.5.1
aarch64-hisiv610-linux-gcc (Hisilicon_aarch64_v610_20170123) 6.2.1 20161016
OpenCV 源码下载
我所使用的OpenCV版本为2.4.13.6,其他版本可以在该地址下载。下载完成后,解压在某个文件夹内。
OpenCV CMake配置
这个比较重要可以,参考wiki中的配置,因为我只需要OpenCV帮我做一下解压图片的工作,所以我去掉了很多自己用不着的工具。
在源码解压的文件夹内新建一个编译文件夹,然后在编译文件夹的地址中执行CMake,对OpenCV进行配置。在CMake配置是需要制定安装目录,也就是编译好的OpenCV库文件都放在哪里。这里我指定的是/root/f/temp_work/opencv-2.4.13.6-source/opencv-2.4.13.6/install-3559
。
由于我是要挂载到远端设备运行程序,所以我这里选择使用静态库。如果需要使用动态库的同学,需要将-DBUILD_SHARED_LIBS=OFF
改为为-DBUILD_SHARED_LIBS=ON
。
我的配置如下,供大家参考,大家可以根据自己的需求进行配置:
cmake .. \
-DCMAKE_C_COMPILER=aarch64-hisiv610-linux-gcc \
-DCMAKE_CXX_COMPILER=aarch64-hisiv610-linux-g++ \
-DCMAKE_INSTALL_PREFIX=<your path>/opencv-2.4.13.6/install-3559 \
-DWITH_CUDA=OFF \
-DWITH_PNP=OFF \
-DWITH_OPENCL=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DAARCH64=ON \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_SYSTEM_PROCESSOR=arm \
-DBUILD_NEW_PYTHON_SUPPORT=OFF \
-DBUILD_TESTS=OFF \
-DWITH_1394=OFF \
-DWITH_EIGEN2=OFF \
-DWITH_FFMPEG=OFF \
-DWITH_GSTREAMER=OFF \
-DWITH_GTK=OFF \
-DWITH_JASPER=OFF \
-DWITH_JPEG=ON \
-DWITH_OPENEXR=OFF \
-DWITH_PNG=ON \
-DWITH_PVAPI=OFF \
-DWITH_QT=OFF \
-DWITH_QT_OPENGL=OFF \
-DWITH_TBB=OFF \
-DWITH_TIFF=OFF \
-DWITH_UNICAP=OFF \
-DWITH_V4L=OFF \
-DWITH_XINE=OFF
需要解码图片所以JPEG和PNG在这里是打开的。
CMake配置完成后会有如下类似的显示:(中途会有一些警告,不用理会)
-- General configuration for OpenCV 2.4.13.6 =====================================
-- Version control: unknown
--
-- Platform:
-- Timestamp: 2018-03-06T08:36:06Z
-- Host: Linux 4.9.75-linuxkit-aufs x86_64
-- CMake: 3.5.1
-- CMake generator: Unix Makefiles
-- CMake build tool: /usr/bin/make
-- Configuration: Release
--
-- C/C++:
-- Built as dynamic libs?: NO
-- C++ Compiler: /opt/hisi-linux/x86-arm/aarch64-hisiv610-linux/target/bin/aarch64-hisiv610-linux-g++ (ver 6.2.1)
-- C++ flags (Release): -fPIC -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG
-- C++ flags (Debug): -fPIC -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG
-- C Compiler: /opt/hisi-linux/x86-arm/aarch64-hisiv610-linux/target/bin/aarch64-hisiv610-linux-gcc
-- C flags (Release): -fPIC -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG
-- C flags (Debug): -fPIC -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG
-- Linker flags (Release):
-- Linker flags (Debug):
-- ccache: NO
-- Precompiled headers: YES
--
-- OpenCV modules:
-- To be built: core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu nonfree contrib stitching superres ts videostab
-- Disabled: world
-- Disabled by dependency: -
-- Unavailable: androidcamera dynamicuda java ocl python viz
--
-- GUI:
-- QT: NO
-- GTK+ 2.x: NO
-- GThread : NO
-- GtkGlExt: NO
-- OpenGL support: NO
-- VTK support: NO
--
-- Media I/O:
-- ZLib: zlib (ver 1.2.7)
-- JPEG: build (ver 62)
-- PNG: build (ver 1.5.27)
-- TIFF: NO
-- JPEG 2000: NO
-- OpenEXR: NO
--
-- Video I/O:
-- DC1394 1.x: NO
-- DC1394 2.x: NO
-- FFMPEG: NO
-- avcodec: NO
-- avformat: NO
-- avutil: NO
-- swscale: NO
-- avresample: NO
-- GStreamer: NO
-- OpenNI: NO
-- OpenNI PrimeSensor Modules: NO
-- PvAPI: NO
-- GigEVisionSDK: NO
-- UniCap: NO
-- UniCap ucil: NO
-- V4L/V4L2: NO/NO
-- XIMEA: NO
-- Xine: NO
--
-- Other third-party libraries:
-- Use IPP: NO
-- Use Eigen: NO
-- Use TBB: NO
-- Use OpenMP: NO
-- Use GCD NO
-- Use Concurrency NO
-- Use C=: NO
-- Use Cuda: NO
-- Use OpenCL: NO
--
-- Python:
-- Interpreter: NO
--
-- Java:
-- ant: NO
-- JNI: NO
-- Java tests: NO
--
-- Tests and samples:
-- Tests: NO
-- Performance tests: NO
-- C/C++ Examples: NO
--
-- Install path: /root/f/temp_work/opencv-2.4.13.6-source/opencv-2.4.13.6/install-3559
--
-- cvconfig.h is in: /root/f/temp_work/opencv-2.4.13.6-source/opencv-2.4.13.6/build-3559
-- -----------------------------------------------------------------
-- Configuring done
-- Generating done
-- Build files have been written to: /root/f/temp_work/opencv-2.4.13.6-source/opencv-2.4.13.6/build-3559
当你看到这样的显示,那就证明你的OpenCV2.4配置完成。
之后进入编译文件夹,执行make -j
开始编译OpenCV,完成后执行make install
将编译好的库安装到制定位置。
2.4.13.6版本在编译过程中并没有遇到什么问题,只是编译的时间有些长(与编译机器的性能有关)。
OpenCV库位置
主库和头文件估计都不用说,按照我上面的配置的话,就在install-3559/lib
和install-3559/include
里面。
这里要注意一下第三方库的存放位置,在编译自己的应用的时候需要额外指定一下:
第三方库存放地址install-3559/share/OpenCV/3rdparty/lib
参考博客:
[1] http://blog.csdn.net/hue2550/article/details/77352109
[2] http://blog.csdn.net/hue2550/article/details/77881249
[3] http://blog.csdn.net/yangxueble/article/details/9268719