0.教学资源
以下是本节课的微课,配合文档学习效果更佳喔。
颜色识别与Lab模型.pptx
1.课前导入
1.1什么是机器视觉?
我们都见过各种摄像头,那么什么是摄像头呢?说到底,就是一个将光学信号转变成电信号的装置。
在摄像头将图像转换成电信号之后,计算机根据像素分布和亮度、颜色等信息,转变成数字化信号。并且对这些信号进行各种运算来提取目标的特征,进而根据判别的结果来控制设备动作。
简单来说,机器视觉就是用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等,并做出相应的反应。
1.2机器视觉工具
OpenMV和IDE
OpenMV是一个可编程的摄像头,通过Python语言可以实现颜色识别,形状识别,人脸识别,数字识别等功能。并且可以外接硬件,制作机器人,比如:追踪小球的云台,人脸识别云台,追踪小球的小车等。
图1.OpenMV示意图
OpenMVIDE是我们要用到的编程软件,内部有一个图像窗口可以直接看到摄像头的图像。
图2.OpenMVIDE界面
相关链接:OpenMVIDE下载 OpenMV更多介绍
2.知识准备
2.1无人驾驶汽车
无人驾驶是机器视觉应用的热门领域,那么无人驾驶汽车是如何通过红绿灯的呢?
第一步.无人汽车首先通过摄像头拍摄路口红绿灯照片;
第二步.使用内置算法对所拍照片进行处理;
第三步.识别出红绿灯的颜色,并根据红绿灯情给汽车发出前进、等待、左右转等指令。
图3.无人驾驶汽车示意图
2.2颜色识别
如何设置摄像头
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) #将像素模式设置成彩色
sensor.set_framesize(sensor.QQVGA) #设置图像大小为QQVGA,需要根据具体情况进行调整
sensor.skip_frames(time = 2000) #在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False) # `关闭自动增益
sensor.set_auto_whitebal(False) # 关闭白平衡
clock = time.clock() #定义时钟
while(True):
clock.tick() #开始计时
img = sensor.snapshot() #输出图像
print(clock.fps()) #输出帧率
Lab模型—锁定颜色
Lab色彩模型,又称亮度 - 对比度模型,被设计来接近人类视觉。
图4.Lab模型示意图
在OpenMVIDE中,点击工具-机器视觉-阈值编辑器,选择帧缓冲区后可以将摄像头拍摄的画面进行颜色捕捉。通过调整Lab阈值,得到想要追踪的颜色区域,如下图演示的追踪红色色块。复制最下方的“Lab阈值”,即可获得“红色”区域的Lab值。
图5.Lab阈值编辑器
将刚才复制的“红色”Lab值粘贴在代码区,创建一个变量“red”,并将值赋予给它。
red=(41,60,44,84,-10,63)
颜色跟踪函数img.find_blobs()
red=(41,60,44,84,-10,63)
img.find_blobs([red],pixels_threshold=200,area_threshold=200)
通过img.find_blobs(),找到红色色块。
[red]:刚刚定义的阈值变量。
pixels_threshold=200:如果色块像素数量小于200,会被过滤掉。
area_threshold:如果色块被框起来的面积小于200,会被过滤掉。
3.动手实践
import sensor, image, time#引入感光元件的模块
red=(41,60,44,84,-10,63)
# 设置摄像头
sensor.reset()#初始化感光元件
sensor.set_pixformat(sensor.RGB565)#设置为彩色
sensor.set_framesize(sensor.QQVGA)#设置图像的大小
sensor.skip_frames(time = 2000)#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False) # 颜色追踪案例中必须关闭自动增益
sensor.set_auto_whitebal(False) # 颜色追踪案例中必须关闭白平衡
clock = time.clock()
# 只有比“pixel_threshold”多的像素和多于“area_threshold”的区域才被“find_blobs”返回。
# 如果更改相机分辨率,请更改“pixels_threshold”和“area_threshold”。
# 一直开启摄像头
while(True):
clock.tick()
img = sensor.snapshot()#拍摄一张照片,img为一个image对象
for blob in img.find_blobs([red],pixels_threshold=200,area_threshold=200):
#如果色块的像素数和面积像素大于200
img.draw_rectangle(blob.rect())#画矩形
img.draw_cross(blob.cx(), blob.cy())#画十字
print(clock.fps())#打印帧数