宿醉断更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的一个小功能叫阈值编辑器。大概流程是这样的
利用新建工程中的例程打开摄像头,拍摄一张你所需要识别的物体的图片。(点击帧缓冲区的禁用相当于拍摄成功照片)
打开IDE中的 工具--机器视觉--阈值编辑器选择帧缓冲区图像
通过调整下面LAB的六个参数,使得所需要识别的物体为白色,其余为黑色(找到临界效果最佳)
复制LAB参数,这些即是识别所需的阈值参数
通过这样的工具,我们就可以得到我们想得到的参数啦。下面我们再介绍一个内容,即二维码识别
我们首先了解一下二维码是什么:二维码又称二维条码,常见的二维码为 QR Code,QR 全称 QuickResponse, 是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形 码能存更多的信息,也能表示更多的数据类型。 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在 代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用 若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光 电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码 制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时 还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
在 MicroPython中,提供了关于二维码识别的API find_qrcodes()用以获得二维码信息,详细函数说明如下:
官方文档
那么我们就可以编写程序来进行二维码的识别啦。文章来源:https://www.toymoban.com/news/detail-646771.html
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())
好啦今天的分享就到此为止啦。文章来源地址https://www.toymoban.com/news/detail-646771.html
到了这里,关于K210学习笔记(八):颜色识别计数与二维码识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!