关于tcs34725传感器,谁用过,颜色不准的问题?
2022-10-161.9万
AI 快速预览详细
本文讨论了TCS34725颜色传感器在颜色识别中的问题。通过分析红色、绿色和黑色的数据读取偏差,提出了一种改进的计算方法。具体来说,通过将RGB值除以clear通道值并乘以255来校准颜色数据,可以更准确地反映实际颜色。这种方法有助于解决颜色识别不准确的问题,提高传感器的准确性。
|
用的是tcs34725,数据读取没有问题,获得数据如下: 红色得到的原始数据是: ct:1291 red:1095 green:103 blue:136 c:-28946 r:217 g:20 b:26 lux:-292 计算后数据是:rgb=217,20,26,lux照度=-292?c色温-28946? 实际这个看起来没啥大问题,也是红色的,只是有点偏差,可以通过修正来解决, 第二组数据: 绿色 ct:2969 red:412 green:1831 blue:575 c:4353 r:35 g:157 b:49 lux:2335 看起来起码他还是个绿色的,也没啥大问题,起码绿色是高的 第三组数据: 黑色 ct:58 red:15 green:22 blue:18 c:6773 r:66 g:97 b:79 lux:16 这个问题就是来,RGB颜色值还是很高,但是照度降低了很多,难道计算时候要把照度作为一个参数计算进去吗?要不颜色不可能计算的对了,因为获得原始rgb的值小了,ct的值也变小,在乘以255后,得到换算的rgb还是挺大,就不可能出现黑色了,而白色也同样的问题! //我总感觉这种算法就不对啊 这个计算方式实际很简单,就是通过获取rgbc四个通道的值,获得一个比例,然后乘以255,就是实际的rgb,clear通道值实际是一直大于rgb的,所有rgb/clear,最大也就是1,得到rgb最大也就是255,这个没有毛病,毛病在于这个rgb不仅仅是看占比啊,rgb=1:1:1和rgb=100:100:100他不是一个颜色啊,这个时候是不是就应该用clear的值去参与计算,问题是怎么参与呢?如果是这样那还不如直接让rgb都除以一个65535然后乘以255后在校准到标准值!这样才能正确反应颜色!另外需要再固定光源下才能准确 读取代码如下: uint16_t clear, red, green, blue,colortemp,lux; tcs.getRGBC(&red, &green, &blue, &clear); tcs.lock(); // turn off LED colortemp = tcs.calculateColorTemperature(red,green,blue); lux = tcs.calculateLux(red,green,blue); // Figure out some basic hex code for visualization uint32_t sum = clear; float r, g, b; String rgb_str; r = red; r /=sum; g = green; g /= sum; b = blue; b /= sum; r *= 255; g *= 255; b *= 255; rgb_str= "R:"+String(r)+' G:'+String(g)+" B:"+String(b); |




除了在代码中校准数值,也可以尝试调整配置参数Integration Time和Gain
r= map(red,0,65535,0,255);
g= map(green,0,65535,0,255);
b= map(blue,0,65535,0,255);
r *= 5.66; g *= 3.75; b *= 3.8;
int max_value = max(max(r,g),b);
if (max_value>255)
{
r= map(r,0,max_value,0,255);
g= map(g,0,max_value,0,255);
b= map(b,0,max_value,0,255);
}