OpenMV提供了两者阈值设置方案。分别是阈值编译器和直方图的方式选择阈值。
阈值编译器:优点,所寻找到的目标颜色更加合理,其他相似颜色区域的干扰比较小。缺点,调节LAB的最大最小值比较花费时间。
直立方图恰好相反,他很容易找到LAB的最大最小值的大体区间,但是容易收到相似颜色区域的干扰。所以,建议两者配合使用,先用直立方图找到LAB的最大最小值的大体区间,再利用阈值编译器对LAB的最大最小值进行微调。
首先我们使用直立方图:
打开OpenMV IDE软件——>右下角有一个直立方图——>颜色识别中,只需要用到LAB色彩空间。
我们要选择绿茶作为目标对象,只需要在帧缓冲区,拖动鼠标左键即可。根据直方图可知,我们的L最大值选择75,最小值为30。A最大值为0,最小值为-70。B的最大值为70,最小值为-10。(注:这个只需要包含绝大部分就行)
之后进行阈值编译器设置:
左上方工具——>机器视觉——>阈值编译器——>帧缓冲区。可对要判断图像的LAB值进行调整。注意:这个时候OpenMV会截取当前的图片作为LAB值调整。所以我们采用阈值编译器的时候,需要提前将目标识别单位放在OpenMV摄像头之前。再进行如上操作
根据直立方图的值,我们调整LAB最大和最小值,尽可能的让要目标识别对象变成全白色。(注:即使没有全部变成白色也不影响,反正最后会把所有没有被滤除的白色区域变成一个大框)然后复制下方的LAB阈值。
将复制的LAB阈值放到thresholds中。注意:我们看到thresholds有多个值,其实是因为我们在for语句中是使用的[thresholds[threshold_index]],而threshold_index为0,也就是说,先择我们在识别红色。因为我们的threshold_index=0,所以我们复制的阈值要求放在thresholds第一个位置(# generic_red_thresholds前)。如果threshold_index=1,我们复制的阈值要求放在thresholds第二个位置(# generic_green_thresholds前)。threshold_index=2,同理放在第三个位置。
threshold_index = 0 # 0 for red, 1 for green, 2 for blue thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds (30, 100, -64, -8, -32, 32), # generic_green_thresholds (0, 30, 0, 64, -128, 0)] # generic_blue_thresholds .....(中间的代码省略) for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True)
但是OpenMV的官方教程我们能看到他的代码是这样的,其实是一样的。只不过这里的LAB阈值不需要注意这么多。直接更改green_threshold后面的值即可。
green_threshold = ( 0, 80, -70, -10, -0, 30) .....(中间的代码省略) blobs = img.find_blobs([green_threshold])