背景
当需要在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 fileif(!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
完成测试