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: YESNEON: 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 本章知识体系

下面这张图,把整个环境搭建的流程串起来了。你跟着这个路线走,基本不会迷路。

边缘智能摄像头开发环境搭建流程 系统选择 Ubuntu 22.04 LTS OpenEuler 22.03 LTS 系统烧录(dd / balenaEtcher) Python环境(pyenv + virtualenv + Python 3.10) OpenCV(源码编译) ONNX Runtime(CPU/NPU)

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