• RK3588移植-opencv交叉编译aarch64


    注意:本文中的所有配置相关路径都与当前安装的路径有关,需要根据自己的环境进行自行修改!!!
    OPENCV如果需要ffmpeg视频模块的话,不建议用cmake-gui,有很多bug。建议在ffmpeg相关依赖配置好后使用“问题:”中的cmake命令。

    概括

    在做yolov5移植rk3588时,由于RKNPU2的example中opencv库不全,缺少VideoCapture\imshow等函数,所以需要自己重新交叉编译opencv并将编译好的aarch64动态库导入,由于网上资料很多不可用,故记录下来操作流程。

    准备资源

    1.cmake
    2.opencv (官网下载,解压即可)
    3.已经编译好的ffmpeg模块
    4.交叉编译器(这里运行的是ubuntu自带的aarch64-linux-gnu-…)

    编译Opencv

    下载Opencv源码后,进入Opencv目录创建build文件夹并进入,之后可以根据所需模块运行下面命令。(GTK为imshow函数所需,不需要可以设置为OFF)。

    cd Opencv目录
    mkdir build
    cd build
    mkdir install_ffmpeg #编译生成的文件都放到该目录
    
    sudo cmake  -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=OFF -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=./install_ffmpeg  -D WITH_GTK=OFF -D WITH_GTK_2_X=OFF  ..
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后再

    sudo make -j8
    sudo make install 
    
    • 1
    • 2

    编译就成功了。

    修改CMakelist文件

    example中的样例使用的是一个简易的opencv库,需要切换到自己编译生成的opencv库,故需要修改example/rknn_yolov5_demo下的CMakeList.txt文件。
    将OpenCV_DIR变量修改为opencv目录下的install_ffmpeg/lib/cmake/opencv4/,如下图所示。
    注意:这里的路径必须用绝对路径由/开头,不能够识别~/家目录

    CMakeList.txt:
    set(OpenCV_DIR  /home/yi/Downloads/opencv-4.6.0/build/install_ffmpeg/lib/cmake/opencv4) 
    
    • 1
    • 2

    进行上序修改之后就可以进行正常编译了,执行sudo ./build-linux_RK3588.sh 即可正确生成可执行文件。

    将lib库复制到/lib目录

    虽然已经能够正确生成可执行文件,但是如果按照之前的步骤adb push install …一顿操作下,会发现在板子端运行可执行程序仍然会报没有找到xxx.so文件的错误。需要将opencv下所有的.so文件放到install/rknn_yolov5_demo_Linux/lib目录下。

    cp ~/Downloads/opencv-4.6.0/build/install_ffmpeg/lib/*
    rknpu2/…/install/rknn_yolov5_demo_Linux/lib

    然后再在进入板子的时候添加LD目录即可正确运行。
    在adb shell中的rknn_yolov5_demo_Linux目录下执行
    export LD_LIBRARY_PATH=./lib

    问题:opencv videoCapture无法运行视频

    参考资料:https://www.cnblogs.com/tangjunjun/p/16527020.html

    原因:交叉编译OPENCV时ffmpeg模块没有正确被编译,cmake时可以看到FFMPEG:NO。需要自行安装ffmpeg的相关依赖,我的依赖全部交叉编译在opencv-depend文件夹下(包括ffmpeg)
    在这里插入图片描述

    尝试添加目录后进行cmake操作,直到FFMPEG:YES

    export LD_LIBRARY_PATH=/ffmpeg_install_path/lib/

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/ffmpeg_install_path/lib/pkgconfig

    export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/ffmpeg_install_path/lib/

    然后在新建的build目录下重新执行下面编译语句。

    sudo cmake  -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=OFF -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=./install_ffmpeg  -D WITH_GTK=OFF  ..
    
    • 1

    注意:下面的语句需要由自己的编译环境来改变
    (CMAKE_C_COMPILER=aarch64-linux-gnu-gcc、CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++、CMAKE_INSTALL_PREFIX=./install_ffmpeg)

    然后再

    sudo make -j8
    sudo make install 
    
    • 1
    • 2

    即可正确编译opencv。

    安装历程(history)

    最后记录一下成功安装的命令行,删除无效的操作历史。
    可以看到在2007时,我将build文件夹生成的文件全部删除,相当于什么配置都没有做。
    2008-2018中间有多次sudo cmake的操作,但是经过make -j8之后都报错了,所以最后修改为2018所示的命令。不清楚多次cmake是否会有缓存文件保留。

     1991  export LD_LIBRARY_PATH=/home/yi/Downloads/opencv-depend/lib
     1992  export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/yi/Downloads/opencv-depend/lib/pkgconfig
     1993  export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/home/yi/Downloads/opencv-depend/lib/pkgconfig
     2005  cd ../
     2006  rm -rf build/*
     2007  sudo rm -rf build/*
     2008  cd build/
     2018  sudo cmake  -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=OFF -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=./install_ffmpeg  -D WITH_GTK=OFF ..
     2019  sudo make -j8
     2020  ls
     2021  mkdir install_ffmpeg
     2022  sudo make install
     2023  ls install_ffmpeg/
     2024  history 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    LeetCode 290. 单词规律
    Collections.addAll()和list.addAll()不同之处说明
    xilinx fpga ultrascale 器件GTX参考时钟注意点
    RC4加密算法详解
    iPhone 15 Pro有5项重大设计升级,让iPhone 15看起来很无聊
    数字化赋能光伏产业链供应链畅通,搭建光伏行业供应链系统加速企业转型升级
    JS基础之对象(自用)
    java中拦截器和过滤器的区别和联系?
    致 喷子们
    TimeWise-Jira工时管理插件6.0.0发布!对比测评某知名工时插件,谁的数据处理性能更胜一筹?
  • 原文地址:https://blog.csdn.net/weixin_44866921/article/details/128113909