news 2026/6/13 11:30:51

用飞凌OK3568开发板+USB摄像头,5分钟搞定一个实时物品识别Demo(附完整Qt工程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用飞凌OK3568开发板+USB摄像头,5分钟搞定一个实时物品识别Demo(附完整Qt工程)

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/root

2.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接口的典型调用顺序:

  1. 模型加载:rknn_init()
  2. 输入设置:rknn_inputs_set()
  3. 推理执行:rknn_run()
  4. 结果获取: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 摄像头无法识别

检查步骤:

  1. 确认摄像头支持UVC协议:
    lsusb
  2. 查看内核识别日志:
    dmesg | grep uvc
  3. 测试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界面优化建议:

  1. 使用双缓冲绘图:
    QPixmap buffer; buffer = QPixmap::fromImage(qImage); m_label->setPixmap(buffer);
  2. 限制刷新频率:
    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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 11:20:52

BepInEx终极指南:5分钟掌握游戏插件框架安装与配置技巧

BepInEx终极指南&#xff1a;5分钟掌握游戏插件框架安装与配置技巧 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想要为心爱的游戏添加自定义功能、修改界面或创造全新玩法吗&am…

作者头像 李华
网站建设 2026/6/13 11:18:52

yansongda/pay 多支付平台统一架构设计与工程实践

yansongda/pay 多支付平台统一架构设计与工程实践 【免费下载链接】pay 可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了 项目地址: https://gitcode.com/gh_mirrors/pa/pay yansongda/pay 是一款面向企业级应用的 PHP 支付 SDK&…

作者头像 李华
网站建设 2026/6/13 11:15:54

大模型水印与内容溯源:AI生成内容标识的技术方案与落地挑战

当GitHub Copilot只能看到你当前打开的文件时&#xff0c;它其实是在"盲人摸象"。而当Claude Code或Cursor Agent能够检索整个代码仓库的上下文时&#xff0c;代码生成的质量会发生质的飞跃。这就是Repo-level RAG&#xff08;仓库级检索增强生成&#xff09;的魔力所…

作者头像 李华
网站建设 2026/6/13 11:15:09

全栈数据科学家:从技术链路到业务价值的完整能力图谱

1. 这个标题不是疑问句&#xff0c;而是一张职业能力自检清单“Full-Stack Data Scientist?”——看到这个标题&#xff0c;我第一反应不是去查维基百科定义&#xff0c;而是下意识打开自己过去三年的项目笔记目录&#xff1a;那个用Flask搭的实时特征服务API、在Kubernetes上…

作者头像 李华