K210学习笔记(八):颜色识别计数与二维码识别

宿醉断更enmmm(喝多太难受了)。前面我们介绍了使用K210进行颜色识别,在实际工程中,我们可能不止需要单纯的识别出来颜色,可能还需要计数(比如前段时间看到的有串串店利用摄像头拍照识别签子数的),当然,识别签子数肯定不是简单的颜色识别计数能解决的,为了保证准确性可能要用到包括纹理特征,颜色特征等多特征加机器学习等方法去实现。下面我们就简单介绍一下怎么去实现颜色识别计数。

前面我们知道,识别颜色需要用的函数是这个:

也就是说我们把颜色识别出来之后,可以通过这个函数返回的blob参数(示例代码中的blobs)来得到色块的对应位置和边界信息。从而便于我们进行绘制对应大小的方框图来标识色块。那么我们该如何获得我到底有多少个目标色块呢。我们一开始的想法可能是直接数方框图的个数,有多少个方框图就有多少个色块。实际上并不用这么麻烦,我们要知道的是blob参数是个什么。他是image.find_blobs这个函数返回的一个列表值。如果我们有

[{"x":82, "y":88, "w":8, "h":7, "pixels":28, "cx":86, "cy":91, "rotation":2.409786, "code":1, "count":1}, {"x":134, "y":148, "w":11, "h":8, "pixels":36, "cx":138, "cy":152, "rotation":0.583126, "code":1, "count":1}, {"x":126, "y":152, "w":8, "h":4, "pixels":18, "cx":129, "cy":154, "rotation":3.032258, "code":1, "count":1}, {"x":56, "y":186, "w":5, "h":6, "pixels":23, "cx":58, "cy":189, "rotation":0.553574, "code":1, "count":1}, {"x":62, "y":187, "w":5, "h":2, "pixels":10, "cx":64, "cy":188, "rotation":0.406981, "code":1, "count":1}]

这是我print出来的结果,对应的计数为5个,所以我们只需要知道blob这个返回值的长度,就可以知道我有多少个色块了。问题也就迎刃而解了。

思路大概说完了,下面就是对应的例程了

import sensor
import time
import lcd

sensor.reset()#重启即初始化摄像头
sensor.set_pixformat(sensor.RGB565)#设置摄像头捕捉格式为彩色656
sensor.set_framesize(sensor.QVGA)#设置捕捉分辨率为320*240
sensor.skip_frames(time = 2000)#等到帧率稳定时间
sensor.set_vflip(1)#设置摄像头为后置模式

clock = time.clock()#初始化一个时钟源用以记录fps
lcd.init()#lcd初始化
#颜色识别阈值(L Min,L Max,A Min,A Max,B Min,B Max)LAB模型
thresholds=[(27, 30, -66, -8, 2, 39)]#需要识别颜色的LAB阈值
while True:
      clock.tick()#启动时钟源
      img=sensor.snapshot()#捕捉照片
      blobs=img.find_blobs([thresholds[0]])#寻找对应目标并存储
      print(blobs)
      if blobs:
         print(len(blobs))
         img.draw_string(0,0,'NUM:'+str(len(blobs)),coloc=(255,255,255),scale=3,mono_space=False)
         for b in blobs:
             tmp=img.draw_rectangle(b[0:4])
             tmp=img.draw_cross(b[5],b[6])
      lcd.display(img)#图片显示
      print(clock.fps())

在这里还有一个小问题,就是我怎么知道我对应物体的LAB值,如何得到我对应的参数值,这就需要用到canmv IDE的一个小功能叫阈值编辑器。大概流程是这样的

  1. 利用新建工程中的例程打开摄像头,拍摄一张你所需要识别的物体的图片。(点击帧缓冲区的禁用相当于拍摄成功照片)

  1. 打开IDE中的 工具--机器视觉--阈值编辑器选择帧缓冲区图像

  1. 通过调整下面LAB的六个参数,使得所需要识别的物体为白色,其余为黑色(找到临界效果最佳)

  1. 复制LAB参数,这些即是识别所需的阈值参数

通过这样的工具,我们就可以得到我们想得到的参数啦。下面我们再介绍一个内容,即二维码识别

我们首先了解一下二维码是什么:二维码又称二维条码,常见的二维码为 QR Code,QR 全称 QuickResponse, 是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形 码能存更多的信息,也能表示更多的数据类型。 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在 代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用 若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光 电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码 制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时 还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

在 MicroPython中,提供了关于二维码识别的API find_qrcodes()用以获得二维码信息,详细函数说明如下:

官方文档

那么我们就可以编写程序来进行二维码的识别啦。

import sensor, image, time,lcd
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)#设置摄像头捕捉格式为RGB565
sensor.set_framesize(sensor.QVGA)#设置分辨率格式为320*240
sensor.set_vflip(1)#设置摄像头为后置模式,即所见即所得
sensor.skip_frames(30)#等待30帧让摄像头稳定


#lcd初始化
lcd.init()
clock=time.clock()#初始化一个时钟源去计算帧率
while True:
      clock.tick()#启动时钟去计算帧率
      img=sensor.snapshot()#拍摄照片
      res=img.find_qrcodes()#寻找二维码
      if(len(res)>0):#在图片中找到二维码
         img.draw_rectangle(res[0].rect())
         img.draw_string(2,2,res[0].payload(),color=(0,128,0),scale=2)
         print(res[0].payload())
         print(res[0])
      lcd.display(img)
      print(clock.fps())

好啦今天的分享就到此为止啦。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要使用K210识别二维码后通过串口将结果发送给STM32F103,你可以按照以下步骤进行操作: 1. 首先,确保K210和STM32F103之间的串口连接正确,包括引脚连接和通信参数设置。 2. 在K210上使用适当的固件或软件来进行二维码识别和解码。你可以使用MaixPy或MicroPython等语言和框架来编写相关的代码。 3. 在K210的代码中,你可以使用相应的库或API来调用二维码识别功能,并获取识别结果。 4. 在获取到二维码识别结果后,使用串口将结果发送给STM32F103。你可以使用K210串口库或API来进行串口通信。示例代码如下: ```python from machine import UART # 初始化K210串口 uart_k210 = UART(UART.UART1, baudrate=115200, bits=8, parity=None, stop=1, timeout=1000, read_buf_len=4096) # 初始化STM32F103串口 uart_stm32 = UART(UART.UART2, baudrate=115200, bits=8, parity=None, stop=1, timeout=1000, read_buf_len=4096) # 识别二维码并获取结果 def recognize_qrcode(): # 识别二维码的代码逻辑 # 返回识别结果 return qrcode_result # 主循环 while True: # 识别二维码 result = recognize_qrcode() # 发送结果给STM32F103 uart_stm32.write(result) # 延时一段时间,等待STM32F103处理结果 time.sleep(1) ``` 5. 在STM32F103端,你需要编写相应的代码来接收来自K210数据,并进行处理。你可以使用STM32F103的串口库或API来进行串口通信。 请注意,以上代码仅为示例,具体的实现可能会因为你所使用的开发板、操作系统和编程语言而有所不同。在实际应用中,你需要根据具体的硬件和软件环境进行适当的调整。同时,还需确保K210和STM32F103之间串口连接的正确性,包括引脚连接和通信参数的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cointreau97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值