首页IT科技k210摄像头模块电路图(【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练)

k210摄像头模块电路图(【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练)

时间2025-06-15 15:44:17分类IT科技浏览8110
导读:前言 本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错拿了两年省一,思来想去,决定开始写博客,将电赛经验分享一二,能力有限,高手轻喷。...

前言

本人大四学生                ,电赛生涯已经走到尽头                       ,一路上踩过不少坑        ,但运气也不错拿了两年省一            ,思来想去                       ,决定开始写博客           ,将电赛经验分享一二        ,能力有限                        ,高手轻喷               。

往期的博客讲述了 K210 的感光元件模块 sensor 的配置               ,机器视觉模块 image 中部分函数的使用(目前是用 find_blobs 函数实现一些寻找不同颜色的目标点    ,寻找不同颜色的线                        ,后面会更新更多 image 模块中的函数使用方法)                   ,按键               、LCD                        、LED的使用,定时器的使用                    ,串口通信的方法                       ,以及如何使用MaixHub平台在线训练模型                        。

sensor 的学习笔记传送门

【K210】K210学习笔记一——sensor

image 的学习笔记传送门

【K210】K210学习笔记二——image

按键        、LCD           、LED的使用 的学习笔记传送门

【K210】K210学习笔记三——按键                       、LCD            、LED的使用

定时器的使用传送门

【K210】K210学习笔记四——定时器的使用

串口通信传送门

【K210】K210学习笔记五——串口通信

MaixHub在线模型训练传送门

【K210】K210学习笔记六——MaixHub在线模型训练识别数字

串口通信(往期)传送门

【串口通信】K210与STM32串口通信        、K210与OpenMV串口通信

本文着重于如何使用K210拍摄图片    ,并将图片上传到MaixHub平台进行模型训练        。补充一下一些经验心得                ,比如一些训练参数的设置           。

K210准备工作

由于K210的RAM只有8M                       ,为了让运行的模型可以更大        ,避免出现内存不够的情况            ,需要刷入小一点的固件                       ,固件及刷固件工具如下           ,我设置的是0积分免费下载                       。

固件烧入

将压缩包解压        ,点开kflash文件夹                        ,双击运行程序            。

在打开的程序中点击打开文件               ,然后选择要刷入的固件        。

然后点击下载即可开始刷入固件                       。

K210如何拍摄照片

准备工作

这里需要用到SD卡    ,首先需要用读卡器打开SD卡                        ,在SD卡根目录下创建一个名为img的文件夹                。

然后将SD卡直接插到K210上即可    。

拍摄相关代码定义

导入模块                   ,这里打算用K210上自带的按键KEY进行拍照(该按键自动接到16脚),所以除了必要的感光元件模块以外                    ,还需要引入引脚注册模块                       ,lcd是方便脱机拍照(代码烧入后    ,可以拿个充电宝或者其他的可以输出5V电压的给K210供电                ,就可以拿着K210拍照了                       ,不然还要带个笔记本电脑怪麻烦的)                       。

# Get_V1.0 - By: FITQY - 周五 8 月 26 日 2022 #__________________________________________________________________ # 导入模块 import sensor, time, image # 导入感光元件模块 sensor 跟踪运行时间模块 time 机器视觉模块 image import utime # 导入延时模块 utime from fpioa_manager import fm # 从 fpioa_manager 模块中导入 引脚注册模块 fm from Maix import GPIO # 从 Maix 模块中导入 模块 GPIO import lcd # 导入 LCD 模块

感光元件的设置        ,比起之前的设置            ,只是多了倒数第二行的设置图像大小为224 x 224                    。

#__________________________________________________________________ # 感光元件设置 sensor.reset() # 重置并初始化感光元件 默认设置为 摄像头频率 24M 不开启双缓冲模式 #sensor.reset(freq=24000000, dual_buff=True) # 设置摄像头频率 24M 开启双缓冲模式 会提高帧率 但内存占用增加 sensor.set_pixformat(sensor.RGB565) # 设置图像格式为 RGB565 (彩色) 除此之外 还可设置格式为 GRAYSCALE 或者 YUV422 sensor.set_framesize(sensor.QVGA) # 设置图像大小为 QVGA (320 x 240) 像素个数 76800 K210最大支持格式为 VGA sensor.set_auto_exposure(0) # 关闭自动曝光 #sensor.set_auto_exposure(0, exposure=120000) # 设置手动曝光 曝光时间 120000 us #sensor.set_auto_gain(0) # 关闭画面增益 sensor.set_auto_gain(0, gain_db = 16) # 设置画面增益 16 dB 影响实时画面亮度 sensor.set_auto_whitebal(0) # 关闭RGB自动增益(白平衡) #sensor.set_auto_whitebal(0, rgb_gain_db = (0,0,0)) # 设置RGB增益 0 0 0 dB 影响画面色彩呈现效果 在 K210 上无法调节增益 初步判定是感光元件 ov2640 无法支持 #sensor.set_contrast(0) # 设置对比度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 #sensor.set_brightness(0) # 设置亮度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 #sensor.set_saturation(0) # 设置饱和度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 sensor.set_vflip(1) # 打开垂直翻转 如果是 01Studio 的 K210 不开启会导致画面方向与运动方向相反 sensor.set_hmirror(1) # 打开水平镜像 如果是 01Studio 的 K210 不开启会导致画面方向与运动方向相反 sensor.set_windowing((224,224)) # 设置图像大小为 224 224 sensor.skip_frames(time = 2000) # 延时跳过2s 等待感光元件稳定

LED的设置                       ,这一步可以没有           ,我只是用来判断按键有没有被按下才加的这个        ,我设置的是                        ,如果按键按下的话               ,LED会切换。

#__________________________________________________________________ # LED的使用 # 注册 LED 引脚 fm.register(14, fm.fpioa.GPIO2, force = True) # 配置 14 脚为 LED_R 强制注册 fm.register(13, fm.fpioa.GPIO1, force = True) # 配置 13 脚为 LED_G 强制注册 fm.register(12, fm.fpioa.GPIO0, force = True) # 配置 12 脚为 LED_B 强制注册 # 创建 LED 对象 LED_R = GPIO(GPIO.GPIO2, GPIO.OUT) # 创建 LED_R 对象 LED_G = GPIO(GPIO.GPIO1, GPIO.OUT) # 创建 LED_G 对象 LED_B = GPIO(GPIO.GPIO0, GPIO.OUT) # 创建 LED_B 对象 # LED控制函数 def LED_Control(led_flag): # LED控制函数 根据传入 led_flag 点亮对应的灯 需要注意的是 0为点亮 1为熄灭 if led_flag == 0: # 传入参数为 0 所有灯打开 LED_R.value(0) LED_G.value(0) LED_B.value(0) elif led_flag == 1: # 传入参数为 1 所有灯关闭 LED_R.value(1) LED_G.value(1) LED_B.value(1) elif led_flag == 2: # 传入参数为 2 红灯常亮 LED_R.value(0) LED_G.value(1) LED_B.value(1) elif led_flag == 3: # 传入参数为 3 绿灯常亮 LED_R.value(1) LED_G.value(0) LED_B.value(1) elif led_flag == 4: # 传入参数为 4 蓝灯常亮 LED_R.value(1) LED_G.value(1) LED_B.value(0) else: # 其他情况 紫灯 LED_R.value(0) LED_G.value(1) LED_B.value(0)

按键的设置    ,和往期一样的                        ,只是把另外三个按键删掉了而已                   ,然后在按键0的回调函数中加入了拍照函数                   。

#__________________________________________________________________ # 按键的使用 # 定义按键控制类 class Key_Control(): # 定义按键控制类 cnt = 0 # 按键计数值 cs = 0 # 按键模式选择标志位 csmax = 0 # 按键模式上限 csflag = 0 # 按键模式切换标志位 cinput = 0 # 按键输入值保存位 control = 0 # 按键确认及发送控制标志位 img_cnt = 0 # 照片计数值 # 实例化按键类 key = Key_Control() # 实例化按键控制类 Key_Control() 为 key key.csmax = 3 # 按键模式上限为 3 即最多有 4 个模式 (0, 1, 2, 3) # 注册按键引脚 fm.register(16, fm.fpioa.GPIOHS0, force = True) # 配置 16 脚为 KEY0 使用高速 GPIO 口 强制注册 # 创建按键对象 KEY0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP) # 创建按键对象 KEY0 # 中断回调函数 KEY0 控制按键模式选择 def Key0_Switch(KEY0): utime.sleep_ms(10) # 延时 10ms 消除按键抖动 if KEY0.value() == 0: # 确认 按键0 按下 key.csflag = 1 # 标记按键模式切换 if key.cs < key.csmax: # 若当前按键模式值小于按键模式选择上限值 key.cs = key.cs + 1 # 控制按键模式选择 自增 else: # 若达到上限 则重新从 0 开始 key.cs = 0 Get_Image(key) # 触发中断的时候拍摄一张照片 # 开启中断 下降沿触发 KEY0.irq(Key0_Switch, GPIO.IRQ_FALLING) # 开启 按键0 外部中断 下降沿触发

拍照函数如下所示,主要就是根据计数器的值保存照片                    ,可以支持保存0000.jpg到9999.jpg共1万张照片                       ,如果你要保存超过1万张    ,再加个判断就好了(emm应该也没有什么电赛题目识别的东西需要这么大的数据集吧)

#__________________________________________________________________ # 获取照片函数 def Get_Image(key): # 拍摄一张照片 保存到 SD卡 的 img 目录下 名字为 000 + key.img_cnt.jpg 如 0001.jpg if key.img_cnt < 10: sensor.snapshot().save("/sd/img/000"+str(key.img_cnt)+".jpg") elif key.img_cnt < 100: sensor.snapshot().save("/sd/img/00"+str(key.img_cnt)+".jpg") elif key.img_cnt < 1000: sensor.snapshot().save("/sd/img/0"+str(key.img_cnt)+".jpg") elif key.img_cnt < 10000: sensor.snapshot().save("/sd/img/"+str(key.img_cnt)+".jpg") key.img_cnt = key.img_cnt + 1 # 计数值自增

然后就是LCD的设置                ,这一步最好要有                       ,有了会比较方便        ,还可以在LCD上看到当前拍摄了几张图片(第一行img_cnt后面显示的数字就是拍摄照片的张数)

#__________________________________________________________________ # LCD # LCD 初始化 lcd.init() # lcd初始化 # LCD 打印照片张数 def LCD_Show(): lcd.draw_string(0, 0, "img_cnt: "+str(key.img_cnt), lcd.BLUE, lcd.WHITE) lcd.draw_string(0, 15, "Gain : "+str(sensor.get_gain_db()), lcd.BLUE, lcd.WHITE) lcd.draw_string(0, 30, "RGBGain: "+str(sensor.get_rgb_gain_db()), lcd.BLUE, lcd.WHITE)

主函数如下所示            ,key.img_cnt这一句话是设置从第几个序号开始保存照片                       ,举个例子                        。

比如设置为0           ,那么就是从0000开始保存    。

设置为100        ,就是从0100开始保存               。

这一个设置的目的就是                        ,方便后续添加数据集               ,比如我现在只拍摄了31张图片    ,那么img文件夹里面的照片是从0000.jpg到0030.jpg                        ,如果要添加新                        。的数据集                   ,那么需要将key.img_cnt的值改成31,就可以从0031.jpg开始保存                    ,如果从0000开始的话会覆盖掉之前的照片        。 #__________________________________________________________________ # 照片起始序号设置 key.img_cnt = 0 #__________________________________________________________________ # 主函数模式选择 while(True): clock.tick() # 跟踪运行时间 img=sensor.snapshot() # 摄像头拍摄一张图片 lcd.display(img) # LCD 显示图像 LCD_Show() # LCD 显示照片张数 LED_Control(key.cs) # 按键控制 LED 表示按键有成功按下 #__________________________________________________________________

完整代码如下                       ,可以复制然后用K210拍摄你的数据集了!

# Get_V1.0 - By: FITQY - 周五 8 月 26 日 2022 #__________________________________________________________________ # 导入模块 import sensor, time, image # 导入感光元件模块 sensor 跟踪运行时间模块 time 机器视觉模块 image import utime # 导入延时模块 utime from fpioa_manager import fm # 从 fpioa_manager 模块中导入 引脚注册模块 fm from Maix import GPIO # 从 Maix 模块中导入 模块 GPIO import lcd # 导入 LCD 模块 #__________________________________________________________________ # 感光元件设置 sensor.reset() # 重置并初始化感光元件 默认设置为 摄像头频率 24M 不开启双缓冲模式 #sensor.reset(freq=24000000, dual_buff=True) # 设置摄像头频率 24M 开启双缓冲模式 会提高帧率 但内存占用增加 sensor.set_pixformat(sensor.RGB565) # 设置图像格式为 RGB565 (彩色) 除此之外 还可设置格式为 GRAYSCALE 或者 YUV422 sensor.set_framesize(sensor.QVGA) # 设置图像大小为 QVGA (320 x 240) 像素个数 76800 K210最大支持格式为 VGA sensor.set_auto_exposure(0) # 关闭自动曝光 #sensor.set_auto_exposure(0, exposure=120000) # 设置手动曝光 曝光时间 120000 us #sensor.set_auto_gain(0) # 关闭画面增益 sensor.set_auto_gain(0, gain_db = 16) # 设置画面增益 16 dB 影响实时画面亮度 sensor.set_auto_whitebal(0) # 关闭RGB自动增益(白平衡) #sensor.set_auto_whitebal(0, rgb_gain_db = (0,0,0)) # 设置RGB增益 0 0 0 dB 影响画面色彩呈现效果 在 K210 上无法调节增益 初步判定是感光元件 ov2640 无法支持 #sensor.set_contrast(0) # 设置对比度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 #sensor.set_brightness(0) # 设置亮度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 #sensor.set_saturation(0) # 设置饱和度 0 这个参数无法读取 且调这个参数对画面似乎不会产生影响 暂时注释 sensor.set_vflip(1) # 打开垂直翻转 如果是 01Studio 的 K210 不开启会导致画面方向与运动方向相反 sensor.set_hmirror(1) # 打开水平镜像 如果是 01Studio 的 K210 不开启会导致画面方向与运动方向相反 sensor.set_windowing((224,224)) # 设置图像大小为 224 224 sensor.skip_frames(time = 2000) # 延时跳过2s 等待感光元件稳定 #__________________________________________________________________ # 创建时钟对象 clock = time.clock() # 创建时钟对象 clock #__________________________________________________________________ # LED的使用 # 注册 LED 引脚 fm.register(14, fm.fpioa.GPIO2, force = True) # 配置 14 脚为 LED_R 强制注册 fm.register(13, fm.fpioa.GPIO1, force = True) # 配置 13 脚为 LED_G 强制注册 fm.register(12, fm.fpioa.GPIO0, force = True) # 配置 12 脚为 LED_B 强制注册 # 创建 LED 对象 LED_R = GPIO(GPIO.GPIO2, GPIO.OUT) # 创建 LED_R 对象 LED_G = GPIO(GPIO.GPIO1, GPIO.OUT) # 创建 LED_G 对象 LED_B = GPIO(GPIO.GPIO0, GPIO.OUT) # 创建 LED_B 对象 # LED控制函数 def LED_Control(led_flag): # LED控制函数 根据传入 led_flag 点亮对应的灯 需要注意的是 0为点亮 1为熄灭 if led_flag == 0: # 传入参数为 0 所有灯打开 LED_R.value(0) LED_G.value(0) LED_B.value(0) elif led_flag == 1: # 传入参数为 1 所有灯关闭 LED_R.value(1) LED_G.value(1) LED_B.value(1) elif led_flag == 2: # 传入参数为 2 红灯常亮 LED_R.value(0) LED_G.value(1) LED_B.value(1) elif led_flag == 3: # 传入参数为 3 绿灯常亮 LED_R.value(1) LED_G.value(0) LED_B.value(1) elif led_flag == 4: # 传入参数为 4 蓝灯常亮 LED_R.value(1) LED_G.value(1) LED_B.value(0) else: # 其他情况 紫灯 LED_R.value(0) LED_G.value(1) LED_B.value(0) #__________________________________________________________________ # 按键的使用 # 定义按键控制类 class Key_Control(): # 定义按键控制类 cnt = 0 # 按键计数值 cs = 0 # 按键模式选择标志位 csmax = 0 # 按键模式上限 csflag = 0 # 按键模式切换标志位 cinput = 0 # 按键输入值保存位 control = 0 # 按键确认及发送控制标志位 img_cnt = 0 # 照片计数值 # 实例化按键类 key = Key_Control() # 实例化按键控制类 Key_Control() 为 key key.csmax = 3 # 按键模式上限为 3 即最多有 4 个模式 (0, 1, 2, 3) # 注册按键引脚 fm.register(16, fm.fpioa.GPIOHS0, force = True) # 配置 16 脚为 KEY0 使用高速 GPIO 口 强制注册 # 创建按键对象 KEY0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP) # 创建按键对象 KEY0 # 中断回调函数 KEY0 控制按键模式选择 def Key0_Switch(KEY0): utime.sleep_ms(10) # 延时 10ms 消除按键抖动 if KEY0.value() == 0: # 确认 按键0 按下 key.csflag = 1 # 标记按键模式切换 if key.cs < key.csmax: # 若当前按键模式值小于按键模式选择上限值 key.cs = key.cs + 1 # 控制按键模式选择 自增 else: # 若达到上限 则重新从 0 开始 key.cs = 0 Get_Image(key) # 触发中断的时候拍摄一张照片 # 开启中断 下降沿触发 KEY0.irq(Key0_Switch, GPIO.IRQ_FALLING) # 开启 按键0 外部中断 下降沿触发 #__________________________________________________________________ # 获取照片函数 def Get_Image(key): # 拍摄一张照片 保存到 SD卡 的 img 目录下 名字为 000 + key.img_cnt.jpg 如 0001.jpg if key.img_cnt < 10: sensor.snapshot().save("/sd/img/000"+str(key.img_cnt)+".jpg") elif key.img_cnt < 100: sensor.snapshot().save("/sd/img/00"+str(key.img_cnt)+".jpg") elif key.img_cnt < 1000: sensor.snapshot().save("/sd/img/0"+str(key.img_cnt)+".jpg") elif key.img_cnt < 10000: sensor.snapshot().save("/sd/img/"+str(key.img_cnt)+".jpg") key.img_cnt = key.img_cnt + 1 # 计数值自增 #__________________________________________________________________ # LCD # LCD 初始化 lcd.init() # lcd初始化 # LCD 打印照片张数 def LCD_Show(): lcd.draw_string(0, 0, "img_cnt: "+str(key.img_cnt), lcd.BLUE, lcd.WHITE) lcd.draw_string(0, 15, "Gain : "+str(sensor.get_gain_db()), lcd.BLUE, lcd.WHITE) lcd.draw_string(0, 30, "RGBGain: "+str(sensor.get_rgb_gain_db()), lcd.BLUE, lcd.WHITE) #__________________________________________________________________ # 照片起始序号设置 key.img_cnt = 0 #__________________________________________________________________ # 主函数模式选择 while(True): clock.tick() # 跟踪运行时间 img=sensor.snapshot() # 摄像头拍摄一张图片 lcd.display(img) # LCD 显示图像 LCD_Show() # LCD 显示照片张数 LED_Control(key.cs) # 按键控制 LED 表示按键有成功按下 #__________________________________________________________________

用K210拍摄到的照片在MaixHub平台上训练模型

因为手头上刚刚好有一个橘子    ,所以我就用它来做一个识别水果的(但我只做了一个识别橘子)                ,将K210上电                       ,然后对着橘子        ,按下KEY键即可拍照了           。

然后            ,要用读卡器打开K210上的SD卡                       ,将文件夹img复制到电脑桌面                       。

然后打开MaixHub平台           ,链接如下        ,账号没注册的注册一个就好(上一期有说)

MaixHub在线训练平台

需要新建一个项目                        ,名称就叫水果识别               ,类型选择图像检测(图像分类只能分类图像    ,并不能获取目标的坐标信息                        ,因此图像检测用的比较多)

然后创建一个数据集                   ,命名为水果            。

然后选中该数据集        。

然后将img中的图片上传到该训练集                       。

然后这一步是上一篇教程中所没有的,需要随机选择几张图片放到验证集中                    ,因为如果验证集中没图片                       ,训练的时候会随机抽取几张图片放到验证集                。

然后就是添加标签    ,设置默认标签                ,然后一张张开始打标签了    。

直到打完所有标签                       ,就可以开始训练了                       。

训练参数设置如下        ,这里随机处理中的选项都不选(随机镜像                       、随机旋转                、随机模糊)            ,模型选择nncase                       ,参数是训练200次           ,批数据量大小是4        ,然后创建任务即可                    。

然后需要记住训练的ID                        ,不然后面找不到。

因为是在线训练               ,不妨我们再创建一个任务    ,这次将图像增强中的随即部分全部勾选上                        ,其他参数不变                   ,再创建一个训练任务,最后与之前的训练任务比较一下                   。

同样的需要记住训练ID                        。

等待训练结束                    ,可以看到                       ,平台告诉我们准确率有1    ,但是在K210上未必每次都能正确识别到                ,因为我这里数据量太小了                       ,就拍摄了四十几张图片        ,镜头拉近拉远可能就无法识别了            ,如果对镜头到目标的距离有要求的                       ,可以根据实际情况靠近或者远一点拍摄图片    。

数据增强的那个训练任务也完成了           ,可以看到        ,这个训练的准确度比没数据增强的高出不少               。

然后就是下载压缩包                        ,进行测试了                        。

测试

首先要将压缩包内的模型复制到SD卡中               ,这里我复制了两个    ,一个是48                        ,一个是50                   ,48是没有数据增强的,50是有数据增强的        。

然后打开48的测试代码测试即可           。

记得将这两个参数设置为1哦                    ,这是开启镜头转置                       。

未开启数据增强的测试结果

未开启数据增强的(序号48)的测试结果不难看出                       ,概率偏低    ,这是因为我拍摄的大部分图片角度都差不多是同一个角度                ,因此可能我测试的时候角度换了一点                       ,概率就下降了            。

拿在手上的测试结果也不太理想        ,经常无法识别        。

开启数据增强的测试结果

可以看出            ,概率明显上升了不少                       。

拿在手上                       ,识别的效果也会比没开启数据增强的好上不少                。

由此可得出           ,若需要提高识别的精准度        ,需要开启数据增强                        ,如果开启数据增强后效果还是不理想               ,则需要增大数据集    。

小结

使用K210拍摄照片    ,在MaixHub平台进行模型训练的教程已经做完了                        ,并且分析了下数据增强对实际测试效果的影响                       。由于我并不是专门学这方面的                   ,因此我感觉我这篇教程还写的不是很好,有新的心得的话                    ,后面我会持续更新的                    。 下一期主要说怎么将识别到的坐标通过串口通信传输到STM32                       ,因为这里用的代码是MaixHub平台提供的    ,我需要将其中用得到的部分加入我之前的代码中                ,然后通过串口通信发送出去                       ,主要是为了方便大家使用        ,我想让大家可以轻松的搞应用            ,在各种比赛拿奖                       ,总之我的比赛之路是走到尽头了           ,就是想将这些经验传承下去吧!下期再见咯!

声明:本站所有文章        ,如无特殊说明或标注                        ,均为本站原创发布。任何个人或组织               ,在未征得本站同意时    ,禁止复制    、盗用                       、采集                    、发布本站内容到任何网站、书籍等各类媒体平台                   。如若本站内容侵犯了原著者的合法权益                        ,可联系我们进行处理                        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python破解WiFi(python psutil库有何用法?) 传奇4搬砖一天多少钱玩哪些游戏赚钱快-Steam《传奇4》稳定6W玩家在线,游戏与赚钱并存,依旧抵不过外挂