Bootstrap

aarch64-opencv341交叉编译,并在arm上部署helloopencv

背景

当需要在jetson xavier nx或者rk 3562等平台上开发关于视觉检测的工程时,由于arm板子资源不足或者不能联网等原因,通常在虚拟机上利用交叉编译器编译得到可执行程序,然后部署到arm板上。

aarch64-opencv341交叉编译

ubuntu虚拟机中先安装cmake,以及cmake-gui

sudo apt-get update
sudo apt-get install cmake
sudo apt-get install cmake-gui

进入gui界面,选择源码地址和build地址

cmake-gui

点下configure按钮,弹出对话框中选择交叉编译工具链,然后选择Opencv源码中platform中的交叉编译工具
在这里插入图片描述
在这里插入图片描述
然后一轮configure后会有报错,可以将关于CUDA、python等的关联去掉,否则可能会报缺少cuda相关库

在这里插入图片描述
opencv_world勾选上,输出一个.so库文件
在这里插入图片描述
除此之外,就是配置好install路径
configure和generate完成后,在终端窗口中cd到opencv-build目录下,分别执行make和make install完成编译和安装

make
make install

将install路径下的include、bin、lib等拷贝到/usr/local/, 并修改文件夹名字为opencv-3.4.1

cp -r install/ /usr/local
mv install opencv-3.4.1

helloOpencv demo验证

写一个helloOpencv.cpp文件和CMakelists.txt来测试

// helloOpencv.cpp
#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    // 创建一个名为 "Hello OpenCV" 的窗口
//    cv::namedWindow("Hello OpenCV", cv::WINDOW_AUTOSIZE);

    // 加载图片(确保图片路径正确)
    cv::Mat image;
    image = cv::imread("1.bmp", 0); // Read the file

    if(!image.data) {
       std::cout <<  "Could not open or find the image" << std::endl ;
       return -1;
    }
    std::cout <<  "read image ok" << std::endl;
    // 显示图片
    //cv::imshow("Hello OpenCV", image);

    // 等待用户按键,再退出
   // cv::waitKey(0);

    return 0;
}
# CMakelists.txt
cmake_minimum_required(VERSION 3.10)

project(HelloOpencv)

set(CMAKE_C_COMPILER   "/usr/bin/aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
#set(CMAKE_CXX_STANDARD 14)

set(OPENCV_DIR /usr/local/opencv-3.4.1)
include_directories(${OPENCV_DIR}/include)

add_executable(HelloOpencv helloOpencv.cpp )
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR})

target_link_libraries(HelloOpencv 
         ${OPENCV_DIR}/lib/libopencv_world.so
        )

新建一个build路径,编译上述源代码

mkdir build
cd build 
cmake ..
make 
make install

由此,得到可执行文件HelloOpencv,使用网线将虚拟机和开发平台连接,利用ssh将文件和.so的opencv库拷贝过去,值得注意的是:.so的库压缩成.tar.gz之后发送到开发板上,直接发送文件会丢失文件的软链接,导致无法运行

# 发送文件
scp HelloOpencv root@板子的ip:/板子上的路径
scp opencv341.tar.gz root@板子的ip:/usr/lib

# ssh登录开发板,在/usr/lib中解压库文件
ssh root@板子的ip
cd /usr/lib
tar -xzvf opencv341.tar.gz
cd /放置执行文件的路径
./HelloOpencv

完成测试

;