“MicroMV 颜色识别”的版本间的差异
(→1、认识Lab 颜色空间空间) |
502748957@qq.com(讨论 | 贡献) |
||
(未显示2个用户的7个中间版本) | |||
第1行: | 第1行: | ||
− | == | + | == 1、快速上手<br /> == |
− | |||
− | |||
− | |||
在IDE中写入以下代码<br /> | 在IDE中写入以下代码<br /> | ||
<source lang="cpp"> | <source lang="cpp"> | ||
第28行: | 第25行: | ||
img.draw_cross(blob.cx(), blob.cy()) | img.draw_cross(blob.cx(), blob.cy()) | ||
</source> | </source> | ||
− | 将openMV连接到电脑,在线运行程序,并将色彩格式调换为“LAB Color”。<br /> | + | 将openMV连接到电脑,在线运行程序,并将色彩格式调换为“LAB Color”。<br/> |
+ | [[File:MicroMV的lab切换.png||300px|left]]<br style="clear: left"/> | ||
+ | 使用鼠标在监视窗口拖选出目标颜色区域,记录下方LAB统计区中每一项的最小值和最大值<br/> | ||
+ | [[File:选取lab.png||300px|left]]<br style="clear: left"/> | ||
+ | 将之前记录的LAB每一项的最小值和最大值,填入threshold内 | ||
+ | [[File:Lab写入.png||500px|left]]<br style="clear: left"/> | ||
+ | 重新运行程序,就可以识别出目标颜色了 | ||
+ | [[File:寻找色块成功.png||500px|left]]<br style="clear: left"/> | ||
+ | == 2、知识延伸 == | ||
+ | ===== 认识Lab 颜色空间 ===== | ||
+ | Lab颜色空间是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另外,这种模式是以数字化方式来描述人的视觉感应,与设备无关,所以它弥补了RGB和 CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能得以映射。Lab空间取坐标Lab,其中L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。 | ||
+ | |||
+ | ===== find_blobs函数: ===== | ||
+ | <source lang="cpp"> | ||
+ | image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0,threshold_cb=None, merge_cb=None) | ||
+ | </source> | ||
+ | • thresholds是颜色lab阈值的列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。<br /> | ||
+ | • roi是“感兴趣区”,roi的格式是(x, y, w, h)的元组<br /> | ||
+ | :x:区域左上角的x坐标 | ||
+ | :y:区域左上角的y坐标 | ||
+ | :w:区域的宽度 | ||
+ | :h:区域的高度 | ||
+ | • x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10。<br /> | ||
+ | • y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5。<br /> | ||
+ | • invert 反转阈值,把阈值以外的颜色作为阈值进行查找<br /> | ||
+ | • area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉<br /> | ||
+ | • pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉<br /> | ||
+ | • merge 合并,如果设置为True,那么合并所有重叠的blob为一个。 注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。<br /> | ||
+ | • margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。<br /> | ||
+ | • threshold_cb未编辑<br /> | ||
+ | • merge_cb未编辑<br /> | ||
+ | ===== blob色块对象: ===== | ||
+ | • blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。<br /> | ||
+ | • blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。<br /> | ||
+ | • blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。<br /> | ||
+ | • blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。<br /> | ||
+ | • blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。<br /> | ||
+ | • blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。<br /> | ||
+ | • blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。<br /> | ||
+ | • blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。<br /> | ||
+ | • blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。<br /> | ||
+ | • blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:<br /> | ||
+ | <source lang="cpp"> | ||
+ | blobs = img.find_blobs([red, blue, yellow], merge=True) | ||
+ | </source> | ||
+ | :如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。<br /> | ||
+ | |||
+ | • blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。<br /> | ||
+ | • blob.area() 返回色块的外框的面积。应该等于(w * h)<br /> | ||
+ | • blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。 比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | [[MicroMV 简介|返回MicroMV目录页面]] |
2018年12月7日 (五) 03:19的最新版本
1、快速上手
在IDE中写入以下代码
import sensor, image
# 设定目标颜色的LAB阈值 (L Min, L Max, A Min, A Max, B Min, B Max)
threshold = (0, 0, 0, 0, 0, 0)
sensor.reset()# 初始化摄像头
sensor.set_pixformat(sensor.RGB565)# 选择像素模式 RGB565
sensor.set_framesize(sensor.QVGA) #设定帧率
sensor.skip_frames(time=1000) #等待摄像头输出稳定
sensor.set_auto_gain(False) #关闭自动增益
sensor.set_auto_whitebal(False) #关闭白平衡。
while(True):
img = sensor.snapshot()# 拍照,返回图像
# 在图像中寻找满足:颜色阈值threshold, 像素阈值pixel_threshold, 面积阈值area_threshold的色块
blobs = img.find_blobs([threshold], pixels_threshold=100, area_threshold=100)
if blobs:
#如果找到了目标颜色
for blob in blobs :
#使用矩形框和十字遍历标示出目标颜色
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
将openMV连接到电脑,在线运行程序,并将色彩格式调换为“LAB Color”。
使用鼠标在监视窗口拖选出目标颜色区域,记录下方LAB统计区中每一项的最小值和最大值
将之前记录的LAB每一项的最小值和最大值,填入threshold内
重新运行程序,就可以识别出目标颜色了
2、知识延伸
认识Lab 颜色空间
Lab颜色空间是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另外,这种模式是以数字化方式来描述人的视觉感应,与设备无关,所以它弥补了RGB和 CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能得以映射。Lab空间取坐标Lab,其中L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。
find_blobs函数:
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0,threshold_cb=None, merge_cb=None)
• thresholds是颜色lab阈值的列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。
• roi是“感兴趣区”,roi的格式是(x, y, w, h)的元组
- x:区域左上角的x坐标
- y:区域左上角的y坐标
- w:区域的宽度
- h:区域的高度
• x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10。
• y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5。
• invert 反转阈值,把阈值以外的颜色作为阈值进行查找
• area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
• pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
• merge 合并,如果设置为True,那么合并所有重叠的blob为一个。 注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。
• margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。
• threshold_cb未编辑
• merge_cb未编辑
blob色块对象:
• blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。
• blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
• blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
• blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
• blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。
• blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
• blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
• blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
• blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。
• blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:
blobs = img.find_blobs([red, blue, yellow], merge=True)
- 如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。
• blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。
• blob.area() 返回色块的外框的面积。应该等于(w * h)
• blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。 比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。