本文主要介绍基于RV1109与RV1126板子编译opencv,并在其运行方法,若编译其它算法,基本也遵循该方法。
为此,我将记录详细过程供读者参考:
一.交叉编译
我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。
交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。
总结:交叉编译实际用ubuntu18.04(其它系统也行,如ubuntu16.04)系统电脑,安装环境编译成RV1126能执行代码,并可移植与执行。
二.编译工具安装
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤: cmake. 与 make
ubuntu系统通常是apt install cmake基本会安装g++ gcc编译环境,并自动配置/usr中,此细节可网络查询。
RV1109-1126可执行的程序需要使用相关架构的编译器,因为arm板子,则使用arm相关编译,并安装到ubuntu18.04系统中,安装如下:
(1)下载交叉编译工具
交叉编译器概念:交叉编译器可以使我们在主机上编译出可以在嵌入式设备上运行的程序
下载地址:Downloads | GNU-A Downloads – Arm Developer
(2)下载后解压,解压命令
xz -d gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
tar -xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar
(3)解压完成后将解压目录设置到bash里,设置环境变量
export PATH=/home/ss/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH
source ~/.bashrc
以上安装引用博客(详情也可点击此博客):https://blog.csdn.net/xidaoliang/article/details/124712491
总结:安装RV1109-1126对应交叉编译器(实质类似gcc/g++),编译arm可执行程序三. Opencv 安装
若需要使用opencv相关读图/视频等相关功能,需安装ffmpeg
ffmpeg安装:
安装包:http://www.ffmpeg.org/releases/
细节参考:https://blog.csdn.net/qq_42528520/article/details/120487457
以上安装的opencv方法可忽略,所有./configure均是cd进入到相应解压包后执行。
注意:如果opencv无法执行读取视频操作,需要检查第二步,很有可能opencv的安装无法检测到ffmeg的pc文件,或者是PKG_CONFIG_PATH路径的设置没有起效。
解决方法为 将/usr/local/ffmpeg/lib/pkgconfig目录下的pc文件复制到/usr/local/lib/pkgconfig目录下。细节参考: https://blog.csdn.net/weixin_29192365/article/details/116554975
opencv安装:
下载地址https://opencv.org/releases/.
若为ubuntu系统选择Sources
操作步骤:
1.预处理步骤
unzip opencv-4.5.3.zip cd opencv-4.5.3 sudo mkdir build cd build
2.camke步骤
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-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=./outputarm -D WITH_GTK=OFF ..
以上通过-D 修改cmake编译opencv的默认值
以下几个命令说明及修改
-D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc //此命令为选择对应的gcc编译名称
-D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ //此命令为选择对应g++编译名称
CMAKE_INSTALL_PREFIX=./outputarm //后续make install 执行安装目录
3.产看opencv是否使用了ffmpeg
若出现以下情况,表明opencv可正常读取视频等操作
FFMPEG: YES
avcodec: YES (ver 56.60.100)
avformat: YES (ver 56.40.101)
avutil: YES (ver 54.31.100)
swscale: YES (ver 3.1.101)
avresample: YES (ver 2.1.0)
若出现以下,也可以读取视频操作:
FFMPEG: NO
avcodec: YES (ver 56.60.100)
avformat: YES (ver 56.40.101)
avutil: YES (ver 54.31.100)
swscale: NO
avresample: NO
若出现以下,则需要执行/usr/local/ffmpeg/lib/pkgconfig目录下的pc文件复制到/usr/local/lib/pkgconfig目录下,我是/usr/local/ffmpeg/lib/pkgconfig文件复制到/usr/local/lib/pkgconfig目录下。前者没验证,但应该可行,后者验证,可行。
FFMPEG: NO
avcodec: NO
avformat: NO
avutil: NO
swscale: NO
avresample: NO
四.交叉编译
简单test.cpp
#include<iostream> #include "opencv2/core/core.hpp" #include "opencv2/highgui.hpp" #include "opencv2/opencv.hpp" using namespace std; int main () { cv::Mat img=cv::imread("./1.jpg"); cout<<"wh:"<<img.cols<<","<<img.rows<<endl; // cv::imshow("window",img); // cv::waitKey(0); return 0; }
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #指定CMake编译最低要求版本 PROJECT(demo) #给项目命名 set(CMAKE_SYSTEM_NAME Linux) # 设置交叉编译器环境 #SET(CMAKE_C_COMPILER /opt/soft/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc) #SET(CMAKE_CXX_COMPILER /opt/soft/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++) # 设置opencv路径 SET(OpenCV_LIBS /home/ubuntu/soft/opencv-4.5.3/build/outputarm/lib/) SET(OpenCV_INCLUDE_DIRS /home/ubuntu/soft/opencv-4.5.3/build/outputarm/include/opencv4/) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -O3") #指定头文件目录 INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) #FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/*.cpp) #FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/*.c) ADD_EXECUTABLE(demo test.cpp) # 设置lib绝对路径库链接 link_directories(${OpenCV_LIBS}) target_link_libraries(demo /home/ubuntu/soft/opencv-4.5.3/build/outputarm/lib/libopencv_core.so /home/ubuntu/soft/opencv-4.5.3/build/outputarm/lib/libopencv_imgproc.so /home/ubuntu/soft/opencv-4.5.3/build/outputarm/lib/libopencv_highgui.so /home/ubuntu/soft/opencv-4.5.3/build/outputarm/lib/libopencv_imgcodecs.so )
说明:target_link_libraries有时不设置绝对路径,可能编译时候找不到lib文件,猜测可能其它版本路径影响。
编译步骤:
1. cmake
cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..
若按照以下在CMakeLists.txt环境中设置,也是可执行,但结果却没有使用指定编译器编译,猜想使用apt install安装x86 gcc g++影响,因此使用上面 -D 指定,可解决该方法
# 设置交叉编译器环境
SET(CMAKE_C_COMPILER /opt/soft/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /opt/soft/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
2.make
make
五.移植
将编译demo文件及依赖opencv库移植(复制)到相应的userdata文件夹中
执行
./demo
结果显示:
额外附ffmpeg与opencv安装方法(修改2022-0912):
https://blog.csdn.net/qq_42528520/article/details/120487457