内容目录
在嵌入式开发中,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
是否正确设置。确保所有依赖库都已正确安装并可被找到。例如:
- A: 这通常是因为链接器找不到某些库。检查你的
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 的交叉编译。合理配置交叉编译环境不仅可以提高编译效率,还可以避免在资源受限的设备上进行编译所带来的问题。希望这篇教程对你有所帮助!🚀
暂无评论内容