海思Hi3516A上移植OpenCV

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

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

    第零步:准备Hi3516A环境。

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

    第一步:下载OpenCV源码。

    登录https://opencv.org/releases/选择相应的版本进行下载。笔者下载的版本是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. 运行以下命令(这一步参考了https://blog.csdn.net/zhenglie110/article/details/83009675步骤三中内容):

    $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. 依然参考https://blog.csdn.net/zhenglie110/article/details/83009675中步骤四的内容,修改源码根目录的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等......

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

    https://blog.csdn.net/zhenglie110/article/details/87933483,这个博客(和上面引用的博客应该是一个作者)中提到,修改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/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的移植任务圆满结束。

 

 

发布了34 篇原创文章 · 获赞 12 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/91982884