用料
- BW21-CBV-Kit x 1
- 行程开关 x 1
项目说明
项目的主要用途是对现场钢板或钢卷的喷码进行视觉识别,识别后将结果通过mqtt传送给服务器,服务器中计划号与识别结果进行核对,核对一致继续执行后续工序,核对不一致,在服务器端给出声光报警提醒,需要操作人员进一步核实。(该项目在测试过程中,由于OCR部分未能找到有效解决方案,暂未实施完成,也恳请大神指点)
流程设计

流程中OCR识别部分,期望使用例程中yolo v7 tiny模型,经过字符训练后替换预装模型,从而实现OCR识别流程,但没有这方面经验,待进一步研究测试......
硬件接线
硬件只涉及一个行程开关,接线较简单,就不上图了。一线接5V,一线接 IOD17。
代码
代码是基于SDCardSaveJPEG进行修改,增加io状态监测、MQTT通讯等程序,由于识别部分功能没有完成,下面只给出可以测试部分代码。
#include "VideoStream.h"
#include "AmebaFatFS.h"
#include <TimeLib.h> // 用于处理日期和时间
#include <WiFi.h>
#include <PubSubClient.h>
// 替换为你的Wi-Fi信息
const char* ssid = "HUAWEI_AX3_5G";
const char* password = "xxxxxxxx";
// 替换为你的MQTT服务器信息
const char* mqttServer = "192.168.3.128";
const int mqttPort = 1883;
const char* mqttTopic = "coil_no";
WiFiClient espClient;
PubSubClient client(espClient);
#define CHANNEL 0
#define IOD17_PIN 17 // 定义 IOD17 引脚
VideoSetting config(VIDEO_FHD, CAM_FPS, VIDEO_JPEG, 1);
uint32_t img_addr = 0;
uint32_t img_len = 0;
AmebaFatFS fs;
// 初始化相机和文件系统
bool initialize() {
Serial.begin(115200);
pinMode(IOD17_PIN, INPUT); // 将 IOD17 引脚设置为输入模式
// 配置相机通道
if (!Camera.configVideoChannel(CHANNEL, config)) {
Serial.println("Failed to configure camera channel");
return false;
}
// 初始化相机
if (!Camera.videoInit()) {
Serial.println("Failed to initialize camera");
return false;
}
// 开始相机通道
if (!Camera.channelBegin(CHANNEL)) {
Serial.println("Failed to begin camera channel");
return false;
}
// 初始化文件系统
if (!fs.begin()) {
Serial.println("Failed to initialize file system");
return false;
}
// 连接Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// 连接MQTT服务器
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT");
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
return true;
}
// 生成日期时间格式的文件名
String generateFileName() {
char fileName[25];
sprintf(fileName, "%04d-%02d-%02d_%02d-%02d-%02d.jpg",
year(), month(), day(), hour(), minute(), second());
return String(fileName);
}
// 捕获图像并保存到文件
bool captureAndSaveImage() {
String fileName = generateFileName();
// 打开文件
File file = fs.open(String(fs.getRootPath()) + fileName, FILE_WRITE);
if (!file) {
Serial.println("Failed to open file");
return false;
}
delay(1000);
// 获取图像
if (!Camera.getImage(CHANNEL, &img_addr, &img_len)) {
Serial.println("Failed to get image");
file.close();
return false;
}
// 写入图像数据到文件
if (file.write((uint8_t *)img_addr, img_len) != img_len) {
Serial.println("Failed to write image to file");
file.close();
return false;
}
// 关闭文件
file.close();
Serial.print("Image saved as: ");
Serial.println(fileName);
return true;
}
// 发送图片到MQTT服务器
bool sendImageToMQTT() {
if (client.publish(mqttTopic, (const char*)img_addr, img_len)) {
Serial.println("Image sent to MQTT");
return true;
} else {
Serial.println("Failed to send image to MQTT");
return false;
}
}
void setup() {
if (!initialize()) {
return;
}
}
void loop() {
if (digitalRead(IOD17_PIN) == HIGH) {
delay(3000); // 延时 3 秒
if (captureAndSaveImage()) {
sendImageToMQTT();
} else {
Serial.println("Image capture and save failed");
}
while (digitalRead(IOD17_PIN) == HIGH); // 等待引脚变为低电平
}
client.loop();
delay(100); // 短暂延时,减少 CPU 占用
}
使用总结
经过一段时间通过实例对BW21-CBV-Kit进行测试,感觉功能还是很全面的,wifi、蓝牙以及各类接口都很全,在识别方面也嵌入了yolo tiny结合demo实例,可以应用于很多场景。
建议该开发板可以支持paddle ocr模型的嵌入,并给出OCR识别的demo示例,这样在OCR方面应用就更方便了。
相关资料
定制 AI 模型安装指南
yolov7-tiny-pytorch
附:
该项目在电脑端已使用MaskTextSpotterV3模型框架实现,项目已投用。经过几次的模型训练迭代,现识别准确率在98%以上。