3、开发环境搭建:系统烧录(Ubuntu/OpenEuler)、Python环境配置、OpenCV与ONNX Runtime安装
说实话,做边缘智能摄像头开发,环境搭建这一步最容易被忽视。很多人急着跑模型,结果系统没选对、库版本冲突,折腾两天还没开始写代码。我当年第一次做RK3588项目时,就因为在Python环境上偷懒用了系统自带的3.8,结果ONNX Runtime死活装不上——嗯,后来老老实实重装了系统。
这一章,咱们就把这些坑一个个填平。我会把我在多个项目里验证过的流程,一步步拆给你看。
3.1 系统选择:Ubuntu还是OpenEuler?
先说说这两个系统的选择。我个人习惯用Ubuntu,原因很简单:社区活跃,遇到问题搜一下就有答案。OpenEuler呢,华为力推的国产系统,在鲲鹏、昇腾平台上有深度优化。
核心建议:
- 新手或快速原型验证 → Ubuntu 22.04 LTS(兼容性最好)
- 国产化项目或信创要求 → OpenEuler 22.03 LTS(内核优化好)
- 两者在边缘摄像头场景下,性能差异不超过5%
3.2 系统烧录:从镜像到启动
系统烧录说白了就是把操作系统写到SD卡或eMMC里。我踩过最大的坑是:烧录工具版本不对,导致分区表错误,板子死活起不来。
3.2.1 准备工作
- 一张32GB以上的TF卡(建议Class 10以上)
- 读卡器
- 烧录工具:Raspberry Pi Imager 或 balenaEtcher
- 系统镜像:Ubuntu 22.04 Server for ARM64 或 OpenEuler 22.03
3.2.2 烧录步骤(以Ubuntu为例)
# 1. 下载镜像
wget https://cdimage.ubuntu.com/releases/22.04/release/ubuntu-22.04.3-preinstalled-server-arm64+raspi.img.xz
# 2. 解压(注意:不要直接解压到SD卡)
xz -d ubuntu-22.04.3-preinstalled-server-arm64+raspi.img.xz
# 3. 查看SD卡设备号
lsblk
# 输出示例:/dev/sdb1 就是你的SD卡
# 4. 烧录(千万注意设备号别写错)
sudo dd if=ubuntu-22.04.3-preinstalled-server-arm64+raspi.img of=/dev/sdb bs=4M status=progress
⚠️ 我曾经犯过的错: 有一次把 of=/dev/sdb 写成了 of=/dev/sda,直接把电脑硬盘给清了。所以烧录前一定用 lsblk 确认三遍设备号。
3.2.3 首次启动配置
烧录完成后,把SD卡插到板子上,上电。第一次启动会自动扩展分区,大概等1-2分钟。然后通过串口或SSH登录:
# 默认账号密码
用户名: ubuntu
密码: ubuntu
# 首次登录会强制修改密码
# 然后更新系统
sudo apt update && sudo apt upgrade -y
3.3 Python环境配置:别用系统自带的
为什么?因为系统自带的Python通常版本老旧,而且你装一堆包会把系统搞乱。我建议用 pyenv + virtualenv 的组合拳。
3.3.1 安装pyenv
# 安装依赖
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# 安装pyenv
curl https://pyenv.run | bash
# 配置环境变量(加到 ~/.bashrc 或 ~/.zshrc)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# 重新加载
source ~/.bashrc
3.3.2 安装Python 3.10
# 查看可安装版本
pyenv install --list | grep 3.10
# 安装(这个过程比较慢,去喝杯咖啡)
pyenv install 3.10.12
# 设置为全局默认
pyenv global 3.10.12
# 验证
python --version
# 输出:Python 3.10.12
💡 小技巧: 如果你在ARM板子上编译Python,记得加上 CONFIGURE_OPTS="--enable-optimizations",虽然编译时间会长一点,但运行速度能提升10%-15%。
3.3.3 创建虚拟环境
# 为项目创建独立环境
pyenv virtualenv 3.10.12 edge_ai_cam
# 激活环境
pyenv activate edge_ai_cam
# 以后每次进入项目目录,自动激活
echo 'edge_ai_cam' > .python-version
3.4 OpenCV安装:从源码编译才是王道
很多人图省事直接 pip install opencv-python,结果发现没有GStreamer支持,摄像头打不开。我建议从源码编译,虽然慢,但功能全。
3.4.1 安装依赖
sudo apt install -y build-essential cmake git pkg-config \
libjpeg-dev libtiff5-dev libpng-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev \
libgtk-3-dev libcanberra-gtk3-module \
libatlas-base-dev gfortran \
python3-dev
3.4.2 编译OpenCV
# 下载源码
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build
# 配置(重点:开启GStreamer和NEON优化)
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_GSTREAMER=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
..
# 编译(-j4 表示用4核,根据你的板子调整)
make -j4
# 安装
sudo make install
sudo ldconfig
验证安装:
python -c "import cv2; print(cv2.getBuildInformation())"
如果看到 GStreamer: YES 和 NEON: YES,说明编译成功了。
3.5 ONNX Runtime安装:选对版本很重要
ONNX Runtime有CPU版和GPU版。边缘摄像头一般用CPU推理,但如果你有NPU(比如RK3588的NPU),就得用对应的定制版。
3.5.1 CPU版本安装
# 最简单的安装方式
pip install onnxruntime
# 验证
python -c "import onnxruntime; print(onnxruntime.__version__)"
3.5.2 针对ARM架构优化
如果你用的是树莓派或Jetson Nano,建议安装带 -aarch64 后缀的版本:
# 下载预编译的whl包
wget https://github.com/microsoft/onnxruntime/releases/download/v1.16.3/onnxruntime-linux-aarch64-1.16.3.tgz
# 解压并安装
tar -xzf onnxruntime-linux-aarch64-1.16.3.tgz
cd onnxruntime-linux-aarch64-1.16.3
pip install onnxruntime-1.16.3-cp310-cp310-linux_aarch64.whl
⚠️ 版本兼容性: ONNX Runtime 1.16 要求 Python 3.8-3.11,如果你用Python 3.12,就得装1.17以上版本。我建议锁定1.16.3,这个版本在ARM平台上最稳定。
3.5.3 验证推理
import onnxruntime as ort
import numpy as np
# 创建session
session = ort.InferenceSession("model.onnx")
# 构造输入
input_name = session.get_inputs()[0].name
input_shape = session.get_inputs()[0].shape
input_data = np.random.randn(*input_shape).astype(np.float32)
# 推理
outputs = session.run(None, {input_name: input_data})
print(f"推理完成,输出shape: {outputs[0].shape}")
3.6 本章知识体系
下面这张图,把整个环境搭建的流程串起来了。你跟着这个路线走,基本不会迷路。
3.7 常见问题与避坑指南
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 烧录后板子不启动 | 镜像不完整或SD卡问题 | 重新下载镜像,用 sha256sum 校验 |
| OpenCV编译报错 | 缺少依赖或内存不足 | 增加swap空间,确保所有依赖已安装 |
| ONNX Runtime导入失败 | Python版本不匹配 | 用 pip debug --verbose 查看兼容版本 |
| 摄像头无法打开 | OpenCV未编译GStreamer支持 | 重新编译,确保 -D WITH_GSTREAMER=ON |
💡 我的经验: 如果你在编译OpenCV时遇到内存不足,可以临时增加swap空间:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
编译完成后记得关掉:sudo swapoff /swapfile
好了,环境搭建这块就这些。你跟着步骤走,应该半小时内就能搞定。下一章咱们开始写第一个视频采集程序——到时候你会发现,前面这些折腾都是值得的。
公众号:蓝海资料掘金营,微信deep3321