海思Hi3516A上移植OpenCV

119 阅读3分钟

本文已参与 [新人创作礼] 活动,一起开启掘金创作之路。

工作中一项任务是将OpenCV移植到Hi3516A平台上。这项工作涉及到很多步骤,中间可以说经历了千难万险,克服了种种艰难困苦,最终成功了!现将过程详细写出,一方面作为此段工作的总结和回顾,另一方面也使后来者能不必再经历我所经历的困难乃至苦难。

言归正传。这个任务需要很多步骤,下边一步一步详细说明。在详述之前先将笔者的开发环境列出:Win10系统上虚拟机Ubuntu14.04。

第零步:准备Hi3516A环境。

关于这一步内容,请参考海思3516A SDK相关文档及网上相关说明,在此不详述。

第一步:下载OpenCV源码。

登录Releases - OpenCV,选择相应的版本进行下载。笔者下载的版本是Open CV - 3.4.1。

第二步:编译前的准备工作。

1. 如果是git clone下载的,直接进入到OpenCV源码根目录;如果下载的是zip文件,则需要先运行unzip opencv-3.4.1.zip命令解压,之后再进入到源码根目录;

2. 建立build文件夹和output文件夹,命令如下:

$mkdir build

$mkdir output

3. 进入build文件夹,命令如下:

$cd build

第三步:编译

关键性的步骤来了!在这里,我把一些开始出错的步骤也列出来,供遇到同样问题的人参考。

1. 运行以下命令(这一步参考了海思3559上移植OpenCV3.4.1 (一) 代码移植_fire_drangon的博客-CSDN博客步骤三中内容):

$cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=../output -D CMAKE_C_COMPILER=arm-hisiv300-linux-gcc -D CMAKE_CXX_COMPILER=arm-hisiv300-linux-g++ -D BUILD_SHARED_LIBS=OFF ../

2. 运行步骤1的过程中可能会卡一会,下载相关内容,如下图所示:

3. CMake完成后,执行make命令。

$make

4. 出现以下错误,如下图所示:

提示找不到zlib.h。

5. 参考网上解决方法,运行以下命令:

sudo apt-get install zlib1g-dev

结果问题依旧。

6. 依然参考海思3559上移植OpenCV3.4.1 (一) 代码移植_fire_drangon的博客-CSDN博客中步骤四的内容,修改源码根目录的CMakeLists.txt,在514行ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR})的下边添加一行内容:

ocv_include_directories(./3rdparty/zlib/)

之后再次重复步骤1-3。上面所引用的参考文章中说,到这一步,他就可以正确编译通过,并最终生成相应文件了。但是在我的环境下还是不行!虽然步骤4中找不到zlib.h的问题解决了,但是引入了新的更为棘手的问题!如下图所示:

提示:

/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnuabi/include/c++/4.8.3/arm-hisiv300-linux-uclibcabi/bits/ctypes_base.h:46:19:error: '__ctype_touplow_t' does not name a type

typedef const __ctype_touplow_t* __to_type;

/opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnuabi/include/c++/4.8.3/arm-hisiv300-linux-uclibcabi/bits/ctypes_base.h:46:19:error: '__ctype_mask_t' does not name a type

typedef const __ctype_mask_t* mask;

......

在网上查找这个问题的解决方法,可就众说纷纭了。有的说是头文件被重复包含导致的;有的说是uclibc不支持ctype导致的;还有的说删了build文件夹,从头再来一遍就解决了的;最气人的有一个帖子,说最后改了几个宏定义解决了,但是就不把具体怎么改的写出来......

没有一个方法有效……

一时间似乎卡住了,不能前行,也不能后退。世界似乎开始变得迷茫......

有病乱投医似的尝试了各种方法,比如下载cmake3-qt-gui,之后通过cmake-gui界面配置;比如差点要修改ctypes.h等......

直到又进行了一种方法尝试后,一丝曙光出现了!在这里要特别提一下,也要特别感谢一下。

海思3559上移植OpenCV3.4.1 (四)在3559A上的适配_fire_drangon的博客-CSDN博客,这个博客(和上面引用的博客应该是一个作者)中提到,修改cmake的配置,也就是扩充了步骤1中的命令:

$cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=../output -D CMAKE_C_COMPILER=arm-hisiv300-linux-gcc -D CMAKE_CXX_COMPILER=arm-hisiv300-linux-g++ -D BUILD_SHARED_LIBS=OFF -D BUILD_ZLIB=ON -D ZLIB_INCLUDE_DIR=../3rdparty/zlib ../

上边红色的部分是关键性的改变。这一次cmake之后,再make时就不再提示上边的错误了,可以正确编译通过!!!

7. 攻克了这一难题后,下边就一马平川了。

$make install

8. 最终在{OpenCV 源码根目录}/output下生成了以下内容:

~/opencv/opencv-3.4.1/output$ ls
bin include lib share

~/opencv/opencv-3.4.1/outputlslib/libopencv_calib3d.alibopencv_features2d.alibopencv_imgcodecs.alibopencv_objdetect.alibopencv_stitching.alibopencv_videoio.alibopencv_core.alibopencv_flann.alibopencv_imgproc.alibopencv_photo.alibopencv_superres.alibopencv_videostab.alibopencv_dnn.alibopencv_highgui.alibopencv_ml.alibopencv_shape.alibopencv_video.apkgconfig/ /opencv/opencv3.4.1/output ls lib/ libopencv\_calib3d.a libopencv\_features2d.a libopencv\_imgcodecs.a libopencv\_objdetect.a libopencv\_stitching.a libopencv\_videoio.a libopencv\_core.a libopencv\_flann.a libopencv\_imgproc.a libopencv\_photo.a libopencv\_superres.a libopencv\_videostab.a libopencv\_dnn.a libopencv\_highgui.a libopencv\_ml.a libopencv\_shape.a libopencv\_video.a pkgconfig/ ~/opencv/opencv-3.4.1/output ls include/
opencv/ opencv2/

至此,OpenCV在Hi3516A的移植任务圆满结束。