发帖
2 0 0

【BW21-CBV-Kit】应用-设备号自动识别核对

风云龙一
注册会员

2

主题

2

回帖

146

积分

注册会员

积分
146
小安派·BW21-CBV-KIt 110 2 4 天前

用料

  • BW21-CBV-Kit x 1
  • 行程开关 x 1

项目说明

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

流程设计

image.png

流程中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%以上。

──── 0人觉得很赞 ────

使用道具 举报

图裂开了
而且你没有附上相应的图片与效果显示视频
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28167 个
  • 话题数: 39946 篇