海思上移植并运行opencv(编译方案,运行例子)
前言
本篇主要叙述如何编译海思平台上使用的opencv以及如何调用。本篇以hisi-linxu200交叉编译器,opencv2.4.x为例
准备阶段
opencv2.4.13.6
海思交叉编译器(arm-himix200-linux)
Ubuntu18.0.4
cmake
前期准备
1、到opencv官网下载opencv-sources版本
https://opencv.org/releases/
2、安装海思交叉编译器(不叙述)
3、安装cmake(不叙述)
PS:关于2可以参考官网文档以及网上例子,关于3网上具体流程有很多。
编译opencv
1、解压opencv-2.4.13.6,并进入opencv-2.4.13.6文件夹下
2、打开终端执行操作
mkdir build
cd build
PS:创建并进入build文件夹下
3、执行cmake指令
cmake -D CMAKE_BUILD_TYE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/your_opencv_path/opencv-2.4.13.6/output \
`cat ../opencv2_cmake.txt` \
-D CMAKE_C_COMPILER=/your_himix200_path/bin/arm-himix200-linux-gcc \
-D CMAKE_CXX_COMPILER=/your_himix200_path/bin/arm-himix200-linux-g++ \
-D BUILD_SHARED_LIBS=OFF \
../
说明:
CMAKE_BUILD_TYE:生成RELEASE库还是DEBUG库(CMAKE_BUILD_TYPE=DEBUG)
cat …/opencv2_cmake.txt:执行命令读取txt内的内容(实际是cmake下的你需要关闭的内容例如:cuda、opencl等)
CMAKE_INSTALL_PREFIX:指定install输出路径。
CMAKE_C_COMPILER:指定需要使用的(交叉)编译器的gcc所在的路径
CMAKE_CXX_COMPILER:指定需要使用的(交叉)编译器的g++所在的路径
BUILD_SHARED_LIBS:生成动态库(.os)(BUILD_SHARED_LIBS=OFF)还是静态库(.a)(BUILD_SHARED_LIBS=ON)
…/:指定到上一级目录
PS:这里只需要生成动态库(.os)即可
执行后成功生成的情况下会在build下生成一堆文件
4、生成opencv动态库
直接在build文件夹下执行make指令即可
make -j 16
说明
1、提示opencv版本找不到,修改opencv文件夹下的cmake文件夹里的OpenCVPackaging.cmake
set(CPACK_PACKAGE_VERSION_PATCH "${OPENCV_VERSION_PATCH}")
set(OPENCV_VCSVERSION "2.4.13.6") #add
set(CPACK_PACKAGE_VERSION "${OPENCV_VCSVERSION}")
PS:line. 20
2、zlib.h: No such file or directory:
打开opencv文件夹下的cmakelist.txt文件加入
ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR})
ocv_include_directories(./3rdparty/zlib/) #add
PS:line. 380
补充:
1、-DWITH_GTK=OFF :关闭imshow相关函数
2、-DWITH_1394=OFF :关闭1384接口(如果出现undefined reference to `omp_get_thread_num’,变这个即可)
3、-DINSTALL_C_EXAMPLES=OFF -DBUILD_EXAMPLES=OFF:关闭编译例子过程(减少编译时间)
如果编译成功就会在build文件夹下的lib文件夹生成相应文件
海思上简单运行opencv读图片
说明:这里只简单叙述流程,不详细叙述。
1、复制opencv的include到相应程序文件夹下
说明:这两个文件,可以使用window下生成的vs使用的include
2、复制生成的opencv的lib(.so库)到相应程序文件夹下
说明:这里主要用的到时core、highgui、imgproc 三个库。
3、添加相应include链接以及os链接
CFLAGS += -I$(PWD)/../opencv/include/
...
OPENCV_DIR = $(PWD)/../opencv
CFLAGS += -L$(OPENCV_DIR)/lib
CFLAGS += -lopencv_imgproc -lopencv_core -lopencv_highgui -fopenmp
说明:-fopenmp为海思中带有的库,运行opencv需要有这个库支持
4、编写代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
using namespace cv;
...
IplImage* pimg;
pimg = cvLoadImage(image_path);
cvSaveImage(save_image_path,pimg);
cvReleaseImage(&pimg);
说明:这里主要需要IplImage的函数调用,cv::Mat调用的可能会报错(问题还未解决)。
5、生成执行程序复制到相机端添加opencv运行所需库,然后运行即可。
说明:这里的库可以根据运行是提示的缺少的动态链接库添加。
运行时可以使用动态链接的方式链接库,也可将相应的.so放入开发板的lib里。