一、硬件介绍
1、产品特点
Arduino Nicla Vision 搭载STM32H747AII6 双核芯片(Cortex-M7_480MHz + Cortex-M4_240MHz),板载六轴智能运动传感器、集成麦克风和距离传感器、Wi-Fi和蓝牙模块、以及一个200万的彩色摄像头

特性

系统框图

功率

二、功能介绍
【接近感应颜色识别】
当图像在ToF传感器设定的距离范围内时,才将摄像头范围内识别到图像的RGB值,通过串口输出显示;
在距离范围外时,串口只输出显示当前ToF检测的距离;
实物搭建效果
上方为:Nical Vision;
下方为:不同的颜色卡片;

三、功能实现
1、距离检测
通过板载的ToF传感器获取当前物体与开发板的实时距离:
MY_DISTANCE 为设定的距离范围变量,只有当ToF检测到超过该值时,才在串口中输出此时的距离值;
主要相关代码
from machine import I2C
from vl53l1x import VL53L1X
import sensor
tof = VL53L1X(I2C(2))
sensor.reset() # 初始化传感器
MY_DISTANCE = 200 # 测距范围 200mm 内
while(True):
distance = tof.read()
if distance <= MY_DISTANCE :
....
else:
print("Distance: %d mm" % distance)2、颜色检测
通过板载的摄像头传感器获取检测到的画面并分析其颜色值:
1、设置识别框范围,分析获取框内的颜色
2、将默认的LaB颜色,转换为RGB888后通过串口输出显示;
import sensor,image,time
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为RGB565.
sensor.set_framesize(sensor.QVGA) # 画面分辨率
sensor.skip_frames(time=2000)
sensor.set_auto_whitebal(False) # 关闭自动白平衡
ROI=(71,133,52,52) # 设置识别框范围
i = 0
avg_r = 0
avg_g = 0
avg_b = 0
while(True):
img = sensor.snapshot()
statistics=img.get_statistics(roi=ROI)
color_l=statistics.l_mode()
color_a=statistics.a_mode()
color_b=statistics.b_mode()
r, g, b = image.lab_to_rgb((color_l, color_a, color_b)) #Lab -> RGB888
r = min(255, max(0, r))
g = min(255, max(0, g))
b = min(255, max(0, b))
avg_r += r
avg_g += g
avg_b += b
i += 1
if(i==10): #获取平均值
print("RGB: (%d, %d, %d)" %
( avg_r // 10, avg_g // 10, avg_b // 10))
i = 0
avg_r = 0
avg_g = 0
avg_b = 0
img.draw_rectangle(ROI) #显示识别框
else:四、代码编写
from machine import I2C
from vl53l1x import VL53L1X
import sensor,image,time
tof = VL53L1X(I2C(2))
sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
sensor.set_auto_whitebal(False) # 关闭自动白平衡
MY_DISTANCE = 200 # 测距范围 200m m 内
ROI=(71,133,52,52) # 识别框内范围
i = 0
avg_r = 0
avg_g = 0
avg_b = 0
while(True):
distance = tof.read()
if distance <= MY_DISTANCE :
img = sensor.snapshot()
statistics=img.get_statistics(roi=ROI)
color_l=statistics.l_mode()
color_a=statistics.a_mode()
color_b=statistics.b_mode()
r, g, b = image.lab_to_rgb((color_l, color_a, color_b))
r = min(255, max(0, r))
g = min(255, max(0, g))
b = min(255, max(0, b))
avg_r += r
avg_g += g
avg_b += b
i += 1
if(i==10):
print("RGB: (%d, %d, %d)" %
( avg_r // 10, avg_g // 10, avg_b // 10))
i = 0
avg_r = 0
avg_g = 0
avg_b = 0
img.draw_rectangle(ROI)
else:
print("Distance: %d mm" % distance) #输出距离值五、效果演示
右侧画面:检测到的颜色卡画面;
左侧串口输出:当前检测到画面的RGB值

实物色卡的颜色值为:#C1328E (193,50,142)
识别到的RGB值为:RGB(173,80,123)
色差值为:7~10 左右

Delta E (CIE76):最基础的色差算法;
Delta E (CIE94):考虑更多视觉感知因素的改进算法;
Delta E (CIEDE2000): 最新、最精准的色差算法;
值越大表示两种颜色的差异越明显;
值越小则差异越不容易被人眼识别;
六、总结
在实际颜色识别过程中,当环境光线等变化时,都会导致检测的RGB值与实际的RGB值不同的误差;
关于误差,主要受以下几个方面的影响:
1、LAB → RGB 的转换
OpenMV 使用的是 RGB565 ↔ LAB 的近似转换算法,不是标准的 ICC 或 sRGB 转换,结果容易失真;
2、环境光线
色卡在不同环境光照下,显示的效果也会不同;
不同光照下(如反光、环境灯光强弱等)色彩还原都会有不同的影响;
3、颜色值转换
将RGB565转换为RGB888时,会存在精度损失;
RGB565 只有16位:R:5bit, G:6bit, B:5bit 每个通道最多32级灰度,导致颜色信息丢失;


我要赚赏金
