一、前言
1.1 项目开发背景
随着生鲜电商、智慧农业及零售智能化的快速发展,果蔬识别需求已广泛覆盖分拣称重、品质检测、食材管理等场景。传统果蔬识别方案存在显著痛点:一是依赖人工识别,效率低且易受主观经验影响(如相似果蔬混淆);二是本地算法模型训练成本高,对小众果蔬识别准确率不足;三是交互界面多为专业工具适配,普通用户操作门槛高。
基于 Linux+QT + 百度 AI 的智能果蔬识别系统应运而生 ——Linux 系统提供稳定的底层环境与硬件资源调度能力,QT 作为跨平台图形化界面(GUI)框架,可实现直观的人机交互,百度 AI 图像识别 API(植物识别模块)则提供成熟的果蔬分类模型(覆盖超 2000 种常见果蔬),三者结合可实现 “高准确率识别、可视化操作、轻量化部署” 的果蔬识别解决方案。
1.2 设计实现的功能
(1)图像采集功能:支持通过 Linux 摄像头实时采集果蔬图像,自动裁剪图像中果蔬主体区域(去除冗余背景),按百度 AI 接口要求调整图像格式(JPG/PNG)与分辨率(建议 600×600 像素,大小≤4MB)。
(2)实时果蔬识别:启动识别后,每秒处理 5-8 帧图像(受网络延迟影响),将预处理后的图像编码为 Base64 格式,调用百度 AI 植物识别 API,1-3 秒内返回识别结果(果蔬名称、置信度、百科信息)。
(3)识别记录功能:识别成功后自动记录记录 ID、果蔬名称、类别(如 “水果 - 苹果”“蔬菜 - 番茄”)、识别时间、置信度、图像存储路径,记录存储于本地 SQLite 数据库,支持手动标记 “已核验” 状态。
(4)可视化交互:通过 QT 界面显示实时摄像头画面、果蔬检测框(蓝色框标注主体)、识别结果(名称 / 置信度 / 类别)、历史记录列表,提供 “开始识别”“保存图像”“导出记录”“API 配置” 等操作按钮。
(5)数据管理:支持识别记录的增删改查(如删除错误记录、补充手动标注信息),记录可导出为 CSV 文件;支持历史识别图像的预览与删除,图像默认存储于 Linux 本地目录(/home/user/fruit_veg_imgs/)。
(6)异常处理:摄像头未连接时弹出 “未检测到摄像头设备” 提示;网络断开时显示 “网络连接失败,请检查网络”;图像模糊或果蔬占比过低时,提示 “图像质量不佳,请重新拍摄”;百度 AI 接口调用失败(如 Token 过期)时,显示对应错误码与解决方案。
1.3 项目软件模块组成
(1)核心识别层:百度 AI 接口调用模块
负责对接百度 AI 植物识别 API,完成 Access Token 获取、图像 Base64 编码、API 请求发送、JSON 结果解析(提取果蔬名称、置信度、类别),是系统高准确率识别的核心,处理所有与 AI 交互的逻辑。
(2)界面交互层:QT GUI 模块
包含主窗口(功能模式切换:识别模式 / 记录模式 / 设置模式)、识别窗口(摄像头预览 + 检测框 + 结果显示)、记录窗口(历史记录表格 + 导出按钮)、设置窗口(API 密钥配置 + 图像存储路径设置),通过组件化设计实现低门槛操作。
(3)数据存储层:SQLite 本地数据库模块
存储两类核心数据:一是识别记录表(记录 ID、果蔬名称、类别、识别时间、置信度、图像路径);二是系统配置表(API Key、Secret Key、Access Token 有效期、图像存储路径),支持数据的增删改查与导出。
(4)系统适配层:Linux 硬件与网络管理模块
负责 Linux 摄像头枚举与初始化(基于 v4l2 驱动)、图像帧采集与格式转换(QImage→JPG)、网络状态监控(基于 libcurl 检测网络连通性)、日志记录(错误日志 / 操作日志存储于 /var/log/fruit_veg_recog/)、权限管理(摄像头访问权限、文件读写权限),保障系统在 Linux 环境下稳定运行。
1.4 设计思路
本项目以 “高准确率、易操作、可追溯” 为核心目标,构建 “图像采集→预处理→AI 识别→结果反馈→数据存储” 的全链路果蔬识别系统,整体设计逻辑如下:
1. 层间协作逻辑
用户通过 QT 界面发起操作(如 “开始识别”)→系统适配层初始化摄像头与网络,采集实时图像帧→将图像转换为 JPG 格式并压缩(≤4MB)→核心识别层对图像进行 Base64 编码,调用百度 AI API(先验证 Access Token 有效性,失效则重新获取)→接收 API 返回的 JSON 数据,解析出果蔬信息→结果反馈至 QT 界面显示→同时将识别记录(含图像路径)写入 SQLite 数据库。
2. 核心流程设计
(1)图像采集与预处理流程:
QT 界面触发 “开始识别” 指令→Linux 摄像头启动(基于 v4l2 驱动)→系统适配层采集图像帧(QImage 格式)→裁剪果蔬主体区域(去除边缘冗余背景)→压缩图像至≤4MB(分辨率调整为 600×600 像素)→转换为 JPG 格式→进行 Base64 编码(符合百度 AI 接口要求)。
(2)果蔬识别流程:
核心识别层检查 Access Token 有效性(若过期,通过 API Key 与 Secret Key 重新请求获取)→构造 API 请求参数(图像 Base64 编码、top_num=3(返回 top3 识别结果))→通过 libcurl 发送 POST 请求至百度 AI 接口→接收 JSON 响应数据→解析数据(提取 name(名称)、score(置信度)、baike_info(类别关联))→筛选置信度≥80% 的结果(低于则标记 “识别不确定”)→反馈至 QT 界面。
(3)记录存储流程:
识别成功(置信度≥80%)→系统适配层将图像保存至本地目录(命名格式:果蔬名_时间戳.jpg)→数据存储层向 SQLite 识别记录表插入数据(含图像路径)→QT 记录窗口实时刷新表格数据。
3. 性能优化逻辑
通过 Linux v4l2 驱动直接操作摄像头,减少图像采集延迟;图像预处理阶段压缩尺寸与体积,降低 API 传输耗时;QT 采用多线程设计(主线程负责界面刷新,子线程负责图像采集、API 调用),避免界面卡顿;Access Token 本地缓存(有效期 30 天),减少重复请求次数;网络请求设置超时重连(3 次重试),提升稳定性。
1.5 开发环境介绍
环境类别 | 具体配置 | 选择理由 |
操作系统 | Ubuntu 22.04 LTS | LTS 版本稳定性强,对 QT、libcurl 兼容性好,支持 v4l2 摄像头驱动,便于部署 |
编程语言 | C++ 11 | QT 核心接口为 C++,执行效率高,适配百度 AI C++ SDK 调用需求 |
核心库 | QT 5.15 LTS、百度 AI C++ SDK、SQLite 3.37.2 | QT 5.15 界面组件成熟,百度 AI SDK 简化 API 调用,SQLite 轻量无需服务 |
开发工具 | QT Creator 10.0.2、VS Code(C++ 插件) | QT Creator 集成界面设计与编译,VS Code 支持代码高亮与调试,提升开发效率 |
辅助工具 | v4l2-utils、curl、base64 | v4l2-utils 测试摄像头(v4l2-ctl --list-devices),curl 测试网络,base64 处理图像编码 |
1.6 环境部署关键步骤
1. 安装 QT
从 QT 官网下载 QT 5.15 LTS,勾选 “QT Widgets”“QT SQL”“QT Network” 组件;
2. 安装百度 AI C++ SDK
从百度 AI 开放平台下载 SDK,解压后配置头文件路径(/usr/include/baidu_ai/)与库文件路径(/usr/lib/baidu_ai/);
3. 安装依赖库
sudo apt-get install sqlite3 libsqlite3-dev libcurl4-openssl-dev(SQLite 与网络请求依赖);
4. 百度 AI API 配置
登录百度 AI 开放平台,创建 “植物识别” 应用,获取 API Key 与 Secret Key;
5. 摄像头权限配置
sudo chmod 666 /dev/video0(授予普通用户摄像头访问权限);
6. 日志目录创建
sudo mkdir /var/log/fruit_veg_recog/ && sudo chmod 777 /var/log/fruit_veg_recog/(授予日志写入权限)。
1.7 模块技术详情介绍
(1)Access Token 获取
通过百度 AI OAuth2.0 接口获取,请求 URL:
https://aip.baidubce.com/oauth/2.0/token,请求参数:
grant_type:固定值 “client_credentials”
client_id:百度 AI 应用的 API Key
client_secret:百度 AI 应用的 Secret Key
响应数据为 JSON 格式,提取 “access_token” 字段(有效期 2592000 秒,即 30 天),本地缓存至 SQLite 配置表。
(2)图像预处理
格式转换:将 QT 采集的 QImage 格式转换为 JPG 格式(调用 QImage::save () 方法,质量参数设为 80);
尺寸调整:若图像分辨率超过 1000×1000 像素,按比例缩小至 600×600 像素(减少传输量);
Base64 编码:调用 OpenSSL 库的 Base64 编码接口,将 JPG 图像二进制数据转换为字符串(百度 AI 接口要求)。
(3)API 调用与结果解析
调用接口:百度 AI 植物识别 API,请求 URL:
https://aip.baidubce.com/rest/2.0/image-classify/v1/plant,请求头:Content-Type: application/x-www-form-urlencoded;
请求参数:
oimage:图像 Base64 编码字符串(需去除前缀 “data:image/jpg;base64,”)
otop_num:返回结果数量,设为 3
oaccess_token:本地缓存的 Access Token
结果解析:响应 JSON 数据示例:
{
"result":[
{
"name":"苹果",
"score":0.982,
"baike_info":{
"description":"苹果是蔷薇科苹果属落叶乔木的果实,富含维生素..."
}
},
{
"name":"红富士苹果",
"score":0.015,
"baike_info":{...}
}
],
"log_id":"123456789"
}
提取 “result” 数组中 “score” 最大的项,若 score≥0.8,判定为 “识别成功”,果蔬类别按 “水果 - 苹果”“蔬菜 - 番茄” 格式关联;若 score<0.8,判定为 “识别不确定”。
二、Linux 下代码设计
2.1 果蔬识别功能
std::string GetPlateNumber(std::string PicturePath){ Json::Value result; std::string image;aip::get_file_content(PicturePath.c_str(), &image);result = client.ingredient(image, aip::null); Json::Value result; std::string image; aip::get_file_content(PicturePath.c_str(), &image); if(result["error_code"].isNull()) { return(result["result"][0]["name"].asString()); } else { //printf("result:%s\n",result); return("识别失败"); }}void Widget::Initcamera(){ camera = cvCreateCameraCapture(0); timer.start(50);}void Widget::ReadFarme(){ //std::string PlateNumber; //从摄像头读取一张图片 //这个函数cvQueryFrame作用是从摄像头或者文件中抓取一帧 //参数为视频获取结构也就是我在初始化摄像头声明的CvCapture *camera; frame = cvQueryFrame(camera); //将图片格式转换成QImage格式,否则不能再lable上显示 imag = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();}void Widget::on_pushButton_clicked(){ std::string PlateNumber; int Ret = 0; frame = cvQueryFrame(camera); //将图片格式转换成QImage格式,否则不能再lable上显示 imag = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped(); //用label显示一张图片 //ui->plateNumber->setPixmap(QPixmap::fromImage(imag)); //保存图片到本地 imag.save("./PlateNumber.jpg", "JPG", 100); //把拍下来的照片传递给百度AI接口获取结果 PlateNumber = GetPlateNumber("./PlateNumber.jpg"); //把接口返回来的数据显示到屏幕上 ui->plateNumber->setText(QString::fromStdString(PlateNumber));}
2.2 运行结果

本系统适用于超市自助称重、生鲜分拣流水线、家庭食材管理等场景,无需本地训练复杂模型,通过调用百度 AI 接口获取高精度识别结果,同时依托 QT 构建简洁操作界面,兼顾实用性与易用性,具备较高的商业落地与民用价值。