5分钟实战:用飞凌OK3568开发板打造实时物品识别系统(附完整Qt工程)
当一块搭载NPU的开发板遇到USB摄像头,会碰撞出怎样的火花?本文将带你用飞凌OK3568开发板快速搭建一个实时物品识别系统,从硬件连接到软件部署,手把手实现AI视觉的落地应用。无论你是嵌入式开发者还是AI初学者,都能在短时间内获得可运行的完整项目体验。
1. 开发环境准备
1.1 硬件清单检查
在开始前,请确保已准备好以下硬件设备:
- 飞凌OK3568开发板(含电源适配器)
- 支持UVC协议的USB摄像头(推荐分辨率640x480)
- 5V/3A电源适配器
- 网线或Wi-Fi连接
- HDMI显示器(可选,用于实时显示)
特别注意:开发板默认NPU驱动已预装,若遇到AI加速相关报错,建议先检查系统镜像是否为最新版本。
1.2 软件依赖安装
通过SSH连接到开发板后,执行以下命令安装必要组件:
# 更新软件源 sudo apt update # 安装Qt基础环境 sudo apt install qt5-default qtcreator -y # 安装OpenCV依赖 sudo apt install libopencv-core-dev libopencv-highgui-dev \ libopencv-imgproc-dev libopencv-videoio-dev -y提示:开发板预装的Rockchip BSP已包含RKNN运行时库,无需额外安装
2. 工程部署与配置
2.1 获取示例代码
我们提供了完整的Qt工程包,包含以下关键文件:
USBCameraSSD/ ├── app_bin/ # 编译输出目录 ├── src/ │ ├── qtcamera.cpp # 摄像头控制核心 │ ├── rknn_ssd.cpp # NPU加速实现 │ └── imageutil.cpp # 图像格式转换 └── qcamera.pro # Qt工程配置文件通过SCP将工程上传至开发板:
scp -r USBCameraSSD root@开发板IP:/home/root2.2 模型文件准备
开发板已预置SSD模型文件,路径为:
/userdata/model/ssd_inception_v2.rknn若需要自定义模型,可使用RKNN-Toolkit进行转换:
# 模型转换示例代码 from rknn.api import RKNN rknn = RKNN() rknn.config(target_platform='rk3568') rknn.load_tensorflow(tf_model='model.pb') rknn.build(do_quantization=True) rknn.export_rknn('custom_model.rknn')3. 核心代码解析
3.1 视频流捕获实现
通过Qt Multimedia模块获取摄像头帧数据:
// 创建自定义视频表面 MyVideoSurface *surface = new MyVideoSurface(this); m_camera->setViewfinder(surface); // 帧捕获信号连接 connect(surface, &MyVideoSurface::frameAvailable, [=](QVideoFrame frame){ frame.map(QAbstractVideoBuffer::ReadOnly); QImage img(frame.bits(), frame.width(), frame.height(), QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat())); emit imageProcessSignal(img); frame.unmap(); });3.2 NPU加速处理流程
RKNN接口的典型调用顺序:
- 模型加载:
rknn_init() - 输入设置:
rknn_inputs_set() - 推理执行:
rknn_run() - 结果获取:
rknn_outputs_get()
关键实现代码片段:
int RknnSsdModel::processFrame(cv::Mat &input, cv::Mat &output) { rknn_input inputs[1] = { {.index=0, .type=RKNN_TENSOR_UINT8, .size=input.total()*input.elemSize(), .fmt=RKNN_TENSOR_NHWC} }; inputs[0].buf = input.data; rknn_output outputs[2]; outputs[0].want_float = 1; outputs[1].want_float = 1; rknn_inputs_set(ctx, 1, inputs); rknn_run(ctx, nullptr); rknn_outputs_get(ctx, 2, outputs, nullptr); // 后处理代码... }4. 常见问题解决方案
4.1 摄像头无法识别
检查步骤:
- 确认摄像头支持UVC协议:
lsusb - 查看内核识别日志:
dmesg | grep uvc - 测试V4L2抓图:
sudo apt install v4l-utils v4l2-ctl --list-devices
4.2 模型推理性能优化
当帧率低于预期时,可尝试:
- 降低输入分辨率(修改
rknn_ssd.cpp中的IMG_WIDTH/HEIGHT) - 关闭量化后处理:
rknn_config cfg = {.quantize_input=false}; rknn_init(&ctx, model, size, 0, &cfg); - 启用NPU低功耗模式:
echo performance > /sys/devices/platform/fde40000.npu/device/power_dpm_force_performance_level
4.3 界面显示卡顿处理
Qt界面优化建议:
- 使用双缓冲绘图:
QPixmap buffer; buffer = QPixmap::fromImage(qImage); m_label->setPixmap(buffer); - 限制刷新频率:
QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &updateFrame); timer->start(33); // 约30fps
5. 功能扩展方向
5.1 多模型切换实现
在rknn_ssd_process.h中添加模型管理接口:
class ModelManager { public: void loadModel(const std::string &path); void switchModel(ModelType type); private: std::map<ModelType, rknn_context> modelMap; };5.2 结果数据持久化
增加检测结果记录功能:
void saveDetectionResult(const cv::Mat &frame, const std::vector<Detection> &results) { std::ofstream log("detections.csv", std::ios::app); for (auto &det : results) { log << det.className << "," << det.confidence << "," << det.bbox.x << "," << det.bbox.y << "\n"; } cv::imwrite("capture_" + std::to_string(time(nullptr)) + ".jpg", frame); }5.3 网络视频流输出
使用GStreamer创建RTMP推流:
# 开发板端推流命令 gst-launch-1.0 v4l2src ! videoconvert ! \ video/x-raw,format=I420 ! x264enc ! \ flvmux ! rtmpsink location='rtmp://server/live/stream'6. 工程编译与部署
6.1 交叉编译配置
在x86主机上配置交叉编译环境:
export PATH=/path/to/toolchain/bin:$PATH mkdir build && cd build /path/to/qt-qmake ../USBCameraSSD.pro make -j$(nproc)6.2 部署脚本优化
创建自动部署脚本deploy.sh:
#!/bin/bash TARGET_IP="192.168.1.100" scp USBCameraSSD root@$TARGET_IP:/home/root ssh root@$TARGET_IP "chmod +x /home/root/USBCameraSSD"6.3 开机自启动设置
创建systemd服务单元:
# /etc/systemd/system/ai-camera.service [Unit] Description=AI Camera Service [Service] ExecStart=/home/root/USBCameraSSD Restart=always [Install] WantedBy=multi-user.target启用服务:
systemctl enable ai-camera systemctl start ai-camera