从零开始:在 Ubuntu 上实现 OpenCV 的 ARM64 交叉编译详细教程 

在嵌入式开发中,OpenCV 是一个非常强大的计算机视觉库。然而,在 ARM 架构的设备上直接编译 OpenCV 可能会遇到性能和资源限制的问题。本文将详细介绍如何在 Ubuntu 上为 ARM64 架构进行 OpenCV 的交叉编译,并提供一些常见问题及其解决方案。

📚 准备工作

📝 环境设置

  • 操作系统:Ubuntu 20.04 或更高版本。
  • 目标平台:ARM64 (aarch64)。
  • 工具链:Linaro GCC 工具链或其他兼容的 ARM64 工具链。

📄 安装依赖

首先,确保你的系统已经安装了必要的开发工具和库:

sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev

🛠️ 获取并配置 OpenCV

🖥️ 下载 OpenCV 和 OpenCV 贡献模块

你可以通过 Git 克隆最新的 OpenCV 源代码:

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

📊 创建构建目录

在 OpenCV 源代码目录旁边创建一个用于构建的目录:

cd opencv
mkdir build
cd build

🔍 配置交叉编译环境

📄 设置环境变量

你需要设置一些环境变量来指向你的 ARM64 工具链。假设你的工具链位于 /opt/linaro/aarch64-linux-gnu 目录下:

export TOOLCHAIN=/opt/linaro/aarch64-linux-gnu
export SYSROOT=$TOOLCHAIN/aarch64-linux-gnu/libc
export CC=$TOOLCHAIN/bin/aarch64-linux-gnu-gcc
export CXX=$TOOLCHAIN/bin/aarch64-linux-gnu-g++
export PKG_CONFIG_PATH=$SYSROOT/usr/lib/pkgconfig

📊 配置 CMake

使用 CMake 来配置交叉编译环境。这里我们启用 OpenCV 的贡献模块,并指定交叉编译工具链文件:

cmake -D CMAKE_SYSTEM_NAME=Linux \
      -D CMAKE_SYSTEM_PROCESSOR=aarch64 \
      -D CMAKE_C_COMPILER=$CC \
      -D CMAKE_CXX_COMPILER=$CXX \
      -D CMAKE_SYSROOT=$SYSROOT \
      -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_python3=OFF \
      -D BUILD_TESTS=OFF \
      -D INSTALL_PYTHON_EXAMPLES=OFF \
      -D INSTALL_C_EXAMPLES=OFF \
      -D WITH_TBB=ON \
      -D WITH_V4L=ON \
      -D WITH_QT=OFF \
      -D WITH_OPENGL=ON ..

🚀 编译与安装

📄 开始编译

配置完成后,可以开始编译 OpenCV:

make -j$(nproc)

📊 安装到目标系统

编译完成后,你可以将生成的库文件复制到目标 ARM64 设备上。通常这些文件位于 build/lib 目录下。

scp -r build/lib/* user@target_device:/usr/local/lib
scp -r build/include/* user@target_device:/usr/local/include

❓ 常见问题及解决方案

  • Q: 交叉编译时找不到某些库怎么办?
    • A: 确保你的工具链和系统根目录包含了所有需要的库。如果缺少某些库,可以尝试手动安装或下载这些库,并将其添加到你的系统根目录中。例如:
sudo apt-get install -y --no-install-recommends libjpeg-turbo8-dev:arm64
  • Q: 编译过程中出现 undefined reference 错误怎么办?
    • A: 这通常是因为链接器找不到某些库。检查你的 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 是否正确设置。确保所有依赖库都已正确安装并可被找到。例如:
export LD_LIBRARY_PATH=$SYSROOT/usr/lib:$LD_LIBRARY_PATH
  • Q: 如何禁用不需要的模块以减小编译时间和库大小?
    • A: 你可以在 CMake 配置时禁用不需要的模块。例如,禁用 Python 绑定和其他不必要的模块:
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=OFF \
-D BUILD_TESTS=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF
  • Q: 如何解决编译过程中出现的内存不足问题?
    • A: 如果你的机器内存有限,可以减少并行编译的线程数。例如:
make -j2
  • 另外,确保你的交换空间足够大,或者增加交换空间:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
  • Q: 如何在目标设备上运行 OpenCV 示例程序?
    • A: 将编译好的示例程序复制到目标设备上,并确保所有依赖库都已正确安装。例如:
scp samples/cpp/example.cpp user@target_device:~
ssh user@target_device
g++ -o example example.cpp `pkg-config --cflags --libs opencv4`
./example

📈 总结

通过本教程,你应该能够在 Ubuntu 上成功地为 ARM64 架构进行 OpenCV 的交叉编译。合理配置交叉编译环境不仅可以提高编译效率,还可以避免在资源受限的设备上进行编译所带来的问题。希望这篇教程对你有所帮助!🚀

© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容