【Yolo系列课】跟我学用K230实现图像分类_哔哩哔哩_bilibili

因为在这个视频中看到一个通过按键采集照片,建立dataset的方法。

但是苦于视频中提到的gitee中的源码力并没有所谓的datacollection.py

所以只好自己想办法把这个功能给补上,最后终于在sdcard下的data文件夹收集到对应的数据图片了,这样就可以按照视频视频中的方法进行数据集的划分,并继续后面的实验了。

 这个是ide运行文件个数的susess提示:

 那么关键还是要上代码:

import time, os, sys

from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
from machine import Pin, FPIOA # 导入Pin模块用于GPIO操作

# 如果你外接了按键到其他引脚,请修改为对应的物理引脚号。

KEY_PIN_NUM = 21 # <--- 修改这里! 例如改为 29 for K230 Dock BUCK_KEY

# KEY_PIN_NUM 对应的 GPIO 功能号 (通常与 GPIO 编号一致)
# K230 Dock BUCK_KEY (Pin 29) 映射到 GPIO 21
KEY_GPIO_FUNC = FPIOA.GPIO21 # <--- 如果 KEY_PIN_NUM 变了,确认这个映射


# 保存图片的路径 (请确保SD卡已插入且此路径可写)
IMG_SAVE_PATH="/sdcard/data"

# 图片文件名前缀 (第一个数字) 和起始编号
# 程序会自动从此编号开始递增,例如 0_0.jpg, 0_1.jpg, ...
# 如果前缀不是数字,则编号从 0 开始。
IMG_SAVE_NAME_PREFIX="0"

# 摄像头分辨率设置
# Sensor.QQVGA: 160x120
# Sensor.QVGA: 320x240
# Sensor.VGA: 640x480
# Sensor.SVGA: 800x600
# Sensor.XGA: 1024x768
# Sensor.HD: 1280x720
# Sensor.SXGA: 1280x1024
# Sensor.UXGA: 1600x1200
# Sensor.FHD: 1920x1080
SENSOR_RESOLUTION = Sensor.FHD # 使用FHD (1920x1080)

# 图片保存格式和质量
SAVE_IMG_FORMAT = "jpg" # 可以是 "jpg", "png", "bmp" 等 sensor 支持的格式
SAVE_IMG_QUALITY = 95   # JPG 质量 (0-100), 对其他格式无效

# --- 配置结束 ---



# 尝试从前缀初始化编号
try:
    save_num = int(IMG_SAVE_NAME_PREFIX)
    IMG_SAVE_NAME_BEGIN = IMG_SAVE_NAME_PREFIX # 如果是数字,前缀就是它本身
    print(f"Starting save number from prefix: {save_num}")
except ValueError:
    save_num = 0
    IMG_SAVE_NAME_BEGIN = IMG_SAVE_NAME_PREFIX # 如果不是数字,也用它做前缀
    print(f"Prefix '{IMG_SAVE_NAME_PREFIX}' is not a number, starting save number from 0.")


sensor = Sensor() #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(Sensor.FHD) #设置帧大小FHD(1920x1080),默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0


#使用IDE缓冲区输出图像,显示尺寸和sensor配置一致。
Display.init(Display.VIRT, sensor.width(), sensor.height())

# 4. 初始化 GPIO 按键
print(f"Initializing GPIO Key on Pin {KEY_PIN_NUM}...")
try:
    # 将 KEY_PIN_NUM 设置为输入模式,并启用内部上拉电阻
    # 按键按下时,引脚电平应变为低 (0)
    fpioa = FPIOA()
    # 将物理引脚 KEY_PIN_NUM 映射到指定的 GPIO 功能
    fpioa.set_function(KEY_PIN_NUM, KEY_GPIO_FUNC)
    # 创建 Pin 对象,使用映射后的引脚,设置为上拉输入
    KEY = Pin(KEY_PIN_NUM, Pin.IN, Pin.PULL_UP)
    print(f"GPIO Key on Pin {KEY_PIN_NUM} initialized. Press to save image.")
    time.sleep_ms(50) # 短暂延时确保上拉稳定
except Exception as e:
    print(f"Error initializing GPIO Key on Pin {KEY_PIN_NUM}: {e}")
    print("Please ensure the pin number is correct and not already in use.")
    print("Image saving via button press will be disabled.")
    KEY = None # 标记按键不可用

MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor

clock = time.clock()


last_key_state = 1 # 记录上次按键状态 (1: 弹起, 0: 按下)

while True:

    ################
    ## 这里编写代码 ##
    ################
    clock.tick()

    img = sensor.snapshot() #拍摄一张图
    if img is None:
                print("Error: Failed to capture image.")
                time.sleep_ms(100)
                continue

    # --- 按键检测与图像保存逻辑 (修正) ---
    current_key_state = 1 # 默认状态为弹起 (高电平)
    if KEY is not None: # 只有按键初始化成功才读取状态
        current_key_state = KEY.value()

    # 检测下降沿 (从 1 -> 0),表示按键刚刚被按下
    if last_key_state == 1 and current_key_state == 0:
        print("Key pressed!")
        # 构建完整的文件名
        filename = f"{IMG_SAVE_PATH}/{IMG_SAVE_NAME_BEGIN}_{save_num}.{SAVE_IMG_FORMAT}"
        try:
            # 保存图像
            print(f"Saving image: {filename} ...")
            img.save(filename, quality=SAVE_IMG_QUALITY)
            print(f"Image saved successfully: {filename}")
            save_num += 1 # 递增编号

            # (可选) 在IDE输出的图像上显示保存成功的提示
            img.draw_string(10, 10, f"Saved: {filename}", color=(0, 255, 0), scale=2)

        except Exception as e:
            print(f"Error saving image {filename}: {e}")
             # (可选) 在IDE输出的图像上显示错误提示
            img.draw_string(10, 10, f"Save Error!", color=(255, 0, 0), scale=2)

        # 简单的按键消抖/延迟 - 等待按键释放
        print("Waiting for key release...")
        time.sleep_ms(50) # 短暂延时防抖
        while KEY is not None and KEY.value() == 0: # 只要按键还按着就等待
            time.sleep_ms(20)
        print("Key released.")
        # 按键已释放,确保下次循环能检测到按下事件
        # current_key_state 理论上现在是 1, 下次循环开始时会重新读取

    # 更新上一次的按键状态,为下一次循环做准备
    last_key_state = current_key_state
    # --- 按键逻辑结束 ---


    Display.show_image(img) #显示图片

    print(clock.fps()) #打印FPS


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐