1. 下载OpenCV4.5
https://github.com/opencv/opencv
eg:4.0.1下载
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.1.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.1.zip
unzip opencv.zip
unzip opencv_contrib.zip
mv opencv-4.0.1 opencv
mv opencv_contrib-4.0.1 opencv_contrib
2. 解压opencv4.5.1.tar.bz2
$ tar xvjf opencv4.5.1.tar.bz2
3. 安装yocto工具链
$ mkdir -p opencv4.5.1/tool_chains
$ ./oecore-x86_64-aarch64-toolchain-nodistro.0.sh -yd /worktemp/opencv4.5.1/tool_chains
4. 编译依赖环境确认 //安装
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential
sudo apt-get install -y cmake cmake-qt-gui
sudo apt-get install -y libgtk2.0-dev
sudo apt-get install -y pkg-config
sudo apt-get install -y python-dev python-numpy
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev
5. 配置交叉编译环境
toolchains.cmake
#目标机target所在的操作系统名称,比如ARM或者Linux你就需要写"Linux",如果Windows平台你就写"Windows",如果你的嵌入式平台没有相关OS你即需要写成"Generic",只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量
#CMAKE_CROSSCOMPILING为TRUE
#this is required
set(CMAKE_SYSTEM_NAME Linux)
set(USER_PATH "/worktemp/opencv4.5.1")
#代表了一系列的相关文件夹路径的根路径的变更,编译器到指定的根目录下寻找对应的系统库
set(CMAKE_SYSROOT ${USER_PATH}/tool_chains/sysroots/aarch64-poky-linux)
set(CMAKE_FIND_ROOT_PATH ${USER_PATH}/tool_chains/sysroots/aarch64-poky-linux)
#指明C和C++编译器
set(tools ${USER_PATH}/tool_chains/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux)
set(CMAKE_C_COMPILER ${tools}/aarch64-poky-linux-gcc)
set(CMAKE_CXX_COMPILER ${tools}/aarch64-poky-linux-g++)
#有些开源的库在编译时需要依赖openssl的库,指明openssl的库和头文件
set(OPENSSL_LIBRARIES ${USER_PATH}/tool_chains/sysroots/aarch64-poky-linux/usr/lib64)
set(OPENSSL_INCLUDE_DIR ${USER_PATH}/tool_chains/sysroots/aarch64-poky-linux/usr/include/openssl)
set(CMAKE_LIBRARY_PATH ${USER_PATH}/tool_chains/sysroots/aarch64-poky-linux/usr/lib64)
#对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#下面的三个选项表示只在交叉环境中查找库和头文件
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
6. 编译脚本
#!/bin/bash
TOP_DIR=${PWD}
echo "---$TOP---"
source $TOP_DIR/tool_chains/environment-setup-aarch64-poky-linux
cd opencv
mkdir -p build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_SYSTEM_NAME=linux \
-D CMAKE_INSTALL_PREFIX=$TOP_DIR/opencv/output \
-D OPENCV_EXTRA_MODULES_PATH=$TOP_DIR/opencv_contrib/modules \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..
make -j4
make install -j4
7. 修改CMakeLists.txt
增加:
set(CMAKE_CROSSCOMPILING TRUE)
include(cmake/toolchain.cmake)
message(STATUS "------------------debug-------------------")
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_BINDIR: ${CMAKE_INSTALL_BINDIR}")
message(STATUS "CMAKE_INSTALL_INCLUDEDIR: ${CMAKE_INSTALL_INCLUDEDIR}")
message(STATUS "CMAKE_CROSSCOMPILING: ${CMAKE_CROSSCOMPILING}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message(STATUS "VERBOSE_MESSAGES: ${VERBOSE_MESSAGES}")
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "CMAKE_LIBRARY_PATH: ${CMAKE_LIBRARY_PATH}")
message(STATUS "------------------debug-------------------")
set(CMAKE_CONFIGURE_COMMAND
cmake
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
-DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR}
#指明依赖的openssl的库路径
-DOPENSSL_ROOT_DIR=${OPENSSL_LIBRARIES}
-DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
-DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
-DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
-DVERBOSE_MESSAGES=${VERBOSE_MESSAGES}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DNROFF_USEFUL=0
--enable-ftp
--enable-tftp
-DBUILD_CURL_EXE=0
-DENABLE_ARES=0
-DUSE_ARES=0
-DBUILD_TESTING=0
-DENABLE_MANUAL=0
-DBUILD_SHARED_LIBS=0
)
8. opencv_contrib打补丁
将opencv_contrib-patch.rar 文件拷贝到
opencv_contrib\modules\xfeatures2d\src 路径下解压.