背景

在乐高ev3 颜色传感器的原理这篇文章中,我们分析了颜色传感器的硬件设计,获取颜色RGB反射量的方法,这篇文章,我们将在此基础上分析如何通过简单的计算获知被测物体的表面颜色。

RGB到HSV的转换

上文我们提到,乐高的颜色传感器实际上就是在检测反射光或者环境光的强度,其分辨不同颜色的关键在于主动分时发出三种不同颜色的光,再判断被测表面对三种颜色的光线反射强度,从而判断被测物表面的颜色。三种颜色分别为红色,绿色和蓝色,基本的原理是,物体本身是什么颜色,就反射什么颜色的光。例如,红色物体,反射红色最多,绿色和蓝色大部分被吸收。因此我们获得的三种颜色反射强度值,其实就可以认为是物体表面的RGB颜色。
那么,如何根据RGB三个值来计算识别物体具体对应什么颜色呢,这里比较好的办法是将RGB色彩空间转到HSV色彩空间,参考由RGB到HSV的转换详解。我们只需要计算色调H的值,根据H的大小就可以判断物体颜色了。
色调H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。其计算方法在参考文献中写的很清楚,就不再赘述。

代码实现

具体到乐高的颜色识别模块,其代码如下(注意,这里是根据乐高颜色传感器的原理推测的算法,并非官方算法和代码):

#define MIN_THR 100
#define BLACK_THR 500
#define WHITE_THR 1500
#define MAX_DELTA 200int color = COLOR_NON;//首先对RGB三色值大小进行排序
Sort(colorAmp,sorted_index);
//先处理比较特殊的,没有被测对象、黑色、白色
//首先判断是否没有被测对象,RGB三个值都小于设定阈值MIN_THR,则表示没有被测对象(或被测物体距离太远)
if(colorAmp[sorted_index[MAX]] <= MIN_THR) {return COLOR_NON;
}
//否则 三个值至少有一个大于MIN_THR
else {//如果最小值小于等于黑色阈值if(colorAmp[sorted_index[MIN]]<=BLACK_THR) {//并且最大值最小值相差不大 判断为黑色if(colorAmp[sorted_index[MAX]]- colorAmp[sorted_index[MIN]] < MAX_DELTA)return COLOR_BLACK;}//否则,最小值大于黑色阈值 并且最大值不超过最小值的1.2倍else if((u32)colorAmp[sorted_index[MAX]]*10 < (u32)colorAmp[sorted_index[MIN]] * 12) {//RGB最小值小于白色阈值 可能是白色物体但是距离太远,还是判断为没有对象if(colorAmp[sorted_index[MIN]]<=WHITE_THR) {return COLOR_NON;}//RGB最小值大于白色阈值,并且最大值不超过最小值的1.2倍 判断为白色else {return COLOR_WHITE;}}//走到这排除了黑色 白色 以及没有被测物/被测物过远,继续判断其它颜色,采用hsv变换//三个值至少有一个大于黑色阈值,并且至少有一个数小于白色阈值if(colorAmp[sorted_index[MAX]]> BLACK_THR && colorAmp[sorted_index[MIN]]<= WHITE_THR && colorAmp[sorted_index[MAX]] != colorAmp[sorted_index[MIN]]) {//计算deltadelta = colorAmp[sorted_index[MAX]] - colorAmp[sorted_index[MIN]];//计算hsv空间色调Hif(sorted_index[MAX] == LED_RED)H = ((int)colorAmp[LED_GREEN]-(int)colorAmp[LED_BLUE])*60/delta;else if(sorted_index[MAX] == LED_GREEN)H = 120 + ((int)colorAmp[LED_BLUE]-(int)colorAmp[LED_RED])*60/delta;elseH = 240 + ((int)colorAmp[LED_RED]-(int)colorAmp[LED_GREEN])*60/delta;if(H<0)H += 360;//根据色调H判断颜色switch(H){case 0 ... 4:case 355 ... 360:color = COLOR_RED;break;case 6 ... 27:color = COLOR_ORANGE;break;case 34 ... 64:color = COLOR_YELLOW;break;case 83 ... 155:color = COLOR_GREEN;break;case 200 ... 244:color = COLOR_BLUE;break;case 245 ... 314:color = COLOR_VIOLET;break;default:color = COLOR_NON;break;}return color;}
}

总的来说,需要先排除黑色、白色和物体距离过远导致反射值很低的情况,这其实就是代表RGB三个值大小接近的情况,这种情况下不适合用HSV空间判断。如果RGB三值相近且都很大,则对应白色;三值相近但是都很小,则对应反射值太低,被测对象太远;三值相近且不算太小,则对应黑色。
排除以上情况后,就可以计算HSV空间的色调H了,由于H值范围已经固定在0-360度,因此算法判断适应性更强。

乐高颜色传感器的颜色识别算法相关推荐

  1. Arduino Uno 使用TCS3200D颜色传感器 分辨颜色

    欢迎关注「凌顺实验室」微信公众号 TCS3200颜色传感器 实验效果 把色纸放在传感器2CM左右高的地方, 可以检测到该物体的RGB值, 然后我们通过画板可以检验出颜色是否正确 在实际环境中,自然光, ...

  2. 【TCS3200 颜色传感器与 Arduino 实现颜色识别】

    TCS3200 颜色传感器与 Arduino 实现颜色识别 前言 TCS3200 颜色传感器引脚 颜色传感器模块如何工作? TCS3200 颜色传感器模块组成 关于颜色传感器 TCS3200 的常见问 ...

  3. 米兔机器人 编程案例_模块化编程 米兔积木机器人颜色传感器

    米兔积木机器人是一款可以用积木拼接搭建外形,用移动终端远程遥控和编程控制的开放式智能电子玩具.自去年年底上市以来,凭借多变的造型以及极强的扩展性深得孩子和家长的喜爱.4月28日首款米兔积木机器人扩展包 ...

  4. 色标传感器和颜色传感器

    https://www.sohu.com/a/391834053_100008100 https://wenku.baidu.com/view/b58e05601ed9ad51f01df2ba 色标传 ...

  5. 关于TCS230颜色传感器的使用

    第一次写博客,大牛直接绕路. 今年山西省电赛题目之一是小车识别红灯,然后停下来.感觉用摄像头的话,比较难,而且花费比较大.网上看到颜色传感器的最佳距离是1cm,抱着试一试的态度,买了一个试一下.经过几 ...

  6. Ardunio开发实例-TCS3200颜色传感器

    颜色传感器 TCS3200颜色传感器可以根据其波长检测多种颜色. 该传感器对颜色识别项目特别有用,例如颜色匹配,颜色分类,试纸条读取等等. TCS3200颜色传感器(如下图所示)使用TAOS TCS3 ...

  7. 基于STM32的颜色传感器TCS3472

    文章目录 前言 一.TCS3472是什么? 二.RGB 颜色传感器分析 三.驱动TCS3472 3.1读取R,G,B 四.测试TCS3472 4.1参数测试 总结 前言 最近由于课程设计要求,用到了一 ...

  8. Ardunio开发实例-VEML6040颜色传感器

    VEML6040颜色传感器 VEML6040颜色传感器可感测红,绿,蓝和白光,并使用CMOS工艺将光电二极管,放大器和模拟/数字电路整合到单个芯片中. 应用颜色传感器后,可以根据环境光源调整背光的亮度 ...

  9. 乐高ev3 颜色传感器的原理

    颜色传感器简介 乐高EV3套件有个颜色传感器,官方介绍如下: 颜色传感器是一种数字传感器,它可以检测到进入传感器表面小窗口的颜色或光强度.该传感器可用于三种模式:颜色模式.反射光强度模式和环境光强度模 ...

  10. 基于颜色分割的盲道识别算法

    基于颜色分割的盲道识别算法 前言   本任务的要求是通过相关算法识别出城市区域中的盲道,通过对各种盲道进行调研,发现目前城市中的盲道基本分为两大部分,一类是具有明显样色和纹理特征的盲道,通常是黄色(当 ...

最新文章

  1. python中安装一个第三方库的命令格式是-无法使用pip命令安装python第三方库的彻底解决方案...
  2. lolfps高但画面不流畅_你吃鸡卡吗,超详细和平精英画面设置教程,解决卡顿,主播都在用...
  3. linux c之snprintf()和sprintf()区别
  4. qr码生成_从Java程序生成QR码图像
  5. 网络请求get和post的区别
  6. 报错空指针异常_Jdk14都要出了,还不能使用 Optional优雅的处理空指针?
  7. ZMQ中线程之间发送命令
  8. oracle中主键自增长,Oracle中给主键设置自增长
  9. 自己制做python3.6精简绿色版
  10. 阿里云安全恶意程序检测冠军经验分享(万字长文)
  11. 7 tips for using UIWebView
  12. element修改图标的大小
  13. 总结过去,展望2019
  14. 一次培训机构的Java面试
  15. 父子游标不可共享的情况分析
  16. 计算机知识竞赛赛制,知识竞赛活动规则
  17. InputStream (输入流) 与 OutputStream (输出流) 转换
  18. 2021年PMP考试考场公布
  19. 基于MATLAB/simulink的水轮发电机调速系统仿真
  20. go-elasticSearch实战篇,带你学会elasticSearch的增删改查

热门文章

  1. python 后台运行及关闭后台程序
  2. Ubuntu10.04下搞定D-Link DWA-125无线网卡驱动
  3. iOS HealthKit
  4. 【编解码】从零开始写H264解码器(2) NALU
  5. WOW战斗逻辑系统分析
  6. 跟我一起走进内联汇编的世界
  7. 权限设计,可控制每个接口的使用。
  8. Google Chrome 提示 Adobe Flash Player 不是最新版本
  9. 运维安全是指什么?如何做好运维安全?
  10. 昆腾公司稍感安慰:向外扩展存储业务营收有所提升