1,从NXT发送颜色数据到电脑 在//Send colors to PC

public static void SendColorToPC(int center, int n) throws Exception

{

//get the x,y of n

int y = n % 3;

int x = (n - y) / 3;

//send to PC by bluetooth

byte[] data = new byte[9];

data[0] = (byte)center;    //center表示是魔方的某一面

data[1] = (byte)x;         //x 表示魔方这一面3*3的色块中,第x行的色块

data[2] = (byte)y;         //y 表示魔方这一面3*3的色块中,第y列的色块

data[3] = (byte)color.getRed();

data[4] = (byte)color.getGreen();

data[5] = (byte)color.getBlue();

data[6] = (byte)(color.getRawRed() / 3);

data[7] = (byte)(color.getRawGreen() / 3);

data[8] = (byte)(color.getRawBlue() / 3);

BlueTooth.WriteBytes(data);

}//Send colors to PCpublic static void SendColorToPC(int center, int n) throws Exception{        //get the x,y of n        int y = n % 3;        int x = (n - y) / 3;        //send to PC by bluetooth        byte[] data = new byte[9];        data[0] = (byte)center;    //center表示是魔方的某一面        data[1] = (byte)x;         //x 表示魔方这一面3*3的色块中,第x行的色块        data[2] = (byte)y;         //y 表示魔方这一面3*3的色块中,第y列的色块        data[3] = (byte)color.getRed();        data[4] = (byte)color.getGreen();        data[5] = (byte)color.getBlue();        data[6] = (byte)(color.getRawRed() / 3);        data[7] = (byte)(color.getRawGreen() / 3);        data[8] = (byte)(color.getRawBlue() / 3);        BlueTooth.WriteBytes(data);}

2,在PC端接受颜色数据 PC程序中的BlueToothDataReceived函数,用来响应接受到蓝牙数据的事件。我们加上下面这段函数:

8759732_181107226109_2.jpg (71.58 KB, 下载次数: 72)

2016-2-6 23:06 上传

else if (length == 9)

{

int i = data[0];

int j = data[1];

int k = data[2];

int r = data[3];

int g = data[4];

int b = data[5];

int rawR = data[6];

int rawG = data[7];

int rawB = data[8];

ColorItem newItem = new ColorItem(i, j, k, r, g, b, rawR, rawG, rawB);

colorDistinguish.ColorItems.Add(newItem);

DisplayMessage += newItem.ToString() + "\r\n";

Status = "成功获取数据:" + i + "," + j + "," + k;

}else if (length == 9){    int i = data[0];    int j = data[1];    int k = data[2];    int r = data[3];    int g = data[4];    int b = data[5];    int rawR = data[6];    int rawG = data[7];    int rawB = data[8];    ColorItem newItem = new ColorItem(i, j, k, r, g, b, rawR, rawG, rawB);    colorDistinguish.ColorItems.Add(newItem);    DisplayMessage += newItem.ToString() + "\r\n";    Status = "成功获取数据:" + i + "," + j + "," + k;}

其中用到了两个类 ColorItem 和 ColorItemDistinguish。这两个类的作用后面再说,总之这里把所有的颜色数据都先保存到一个阵列(Array)里,最后统一识别颜色。

3,解析颜色的方案 细心的朋友可能在API中看到了getColor()函数,我们何必要全部保存颜色后再统一分辨呢,直接读一个分辨一个不是更好?事实证明这个函数基本没 什么用,红色和橙色都会解析成红色,而且环境光线变化时影响很大。还有一些朋友建议用HSV颜色模型,这种方案我也试过了,基本上也很难分辨。为什么呢? 请看下面一组读数:Red

[0,1,2]=>RGB=(23,0,0),RawRGB={45,1,8}

[0,2,2]=>RGB=(30,0,0),RawRGB={60,1,5}

[0,2,1]=>RGB=(25,0,0),RawRGB={49,3,12}

[0,2,0]=>RGB=(32,0,0),RawRGB={63,2,6}

[0,1,0]=>RGB=(22,0,0),RawRGB={43,2,11}

[0,0,0]=>RGB=(25,0,0),RawRGB={59,3,3}

[0,0,1]=>RGB=(30,0,0),RawRGB={58,5,17}

[0,0,2]=>RGB=(31,0,0),RawRGB={61,8,17}

[0,1,1]=>RGB=(31,0,0),RawRGB={62,15,22}

Orange

[2,1,2]=>RGB=(28,0,0),RawRGB={55,12,8}

[2,2,1]=>RGB=(30,0,0),RawRGB={57,14,14}

[2,0,1]=>RGB=(32,0,0),RawRGB={62,15,13}

[2,1,0]=>RGB=(32,0,0),RawRGB={63,16,12}

[2,2,2]=>RGB=(42,0,0),RawRGB={83,24,10}

[2,2,0]=>RGB=(41,0,0),RawRGB={82,24,13}

[2,0,0]=>RGB=(41,0,0),RawRGB={80,23,10}

[2,0,2]=>RGB=(39,0,0),RawRGB={76,22,13}

[2,1,1]=>RGB=(41,5,0),RawRGB={81,30,21}Red[0,1,2]=>RGB=(23,0,0),RawRGB={45,1,8}[0,2,2]=>RGB=(30,0,0),RawRGB={60,1,5}[0,2,1]=>RGB=(25,0,0),RawRGB={49,3,12}[0,2,0]=>RGB=(32,0,0),RawRGB={63,2,6}[0,1,0]=>RGB=(22,0,0),RawRGB={43,2,11}[0,0,0]=>RGB=(25,0,0),RawRGB={59,3,3}[0,0,1]=>RGB=(30,0,0),RawRGB={58,5,17}[0,0,2]=>RGB=(31,0,0),RawRGB={61,8,17}[0,1,1]=>RGB=(31,0,0),RawRGB={62,15,22}Orange[2,1,2]=>RGB=(28,0,0),RawRGB={55,12,8}[2,2,1]=>RGB=(30,0,0),RawRGB={57,14,14}[2,0,1]=>RGB=(32,0,0),RawRGB={62,15,13}[2,1,0]=>RGB=(32,0,0),RawRGB={63,16,12}[2,2,2]=>RGB=(42,0,0),RawRGB={83,24,10}[2,2,0]=>RGB=(41,0,0),RawRGB={82,24,13}[2,0,0]=>RGB=(41,0,0),RawRGB={80,23,10}[2,0,2]=>RGB=(39,0,0),RawRGB={76,22,13}[2,1,1]=>RGB=(41,5,0),RawRGB={81,30,21}

这是在自然光条件下,对红色和橙色的9个色块分别读数的结果。可以看到,它们的Green和Blue分量全部是0,只有红色分量有差别。但是红色的 red分量从23~32,橙色的red分量从28~42,它们中间是有重叠的。对于这些读数,HSV完全没用。 有一段时期我几乎已经绝望了,不过终于在最后让我找到了一点区别:红色的RawBlue分量基本上比RawGreen分量稍大,而橙色恰好相反。另外请对 比一下[0,0,0]和[2,2,1],它们的RawBlue分量和RawGreen分量是相同的,但是仍然可以找到区别:按公式R+2*RawG- 2*RawB计算,橙色的永远比红色大!

也就是说,我们单独取到一组颜色数值时,很难直接知道它是什么颜色,只有对一组数进行排序后,才能区分出不同的颜色。就像刚才这18个数,我们按照 R+2*RawG-2*RawB从大到小排序,最终结果的前9个是橙色,后9个就是红色。类似的,我们还可以定义出分辨颜色的判断规则: 1,假设RGB三个值的最小值为Min,按Min从大到小排序,前9个是白色 2,剩下的颜色,按照G分量从大到小排序,前9个是黄色(有意思吧,绿色分量最大的是黄色) 3,剩下的颜色,按照B分量从大到小排序,前9个是蓝色(这个还算靠谱) 4,剩下的颜色,按照R分量从小到大排序,前9个是绿色 5,剩下的颜色,按照R+2*RawG-2*RawB从大到小排序,前9个是橙色 6,剩下的颜色全是红色

python识别魔方色块_解魔方机器人教程:识别颜色相关推荐

  1. python识别魔方色块_解魔方的机器人攻略23 – 识别颜色(上)

    今天看到架子上的萝卜头,已经落了很多灰尘.想起萝卜头的攻略还剩几篇迟迟没有写完.前一段时间一直在试验小爱的手机遥控器功能,从今天开始准备陆续把萝卜头的攻略补完,给博客也打扫打扫灰尘. 说起来真是很惭愧 ...

  2. 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法

    我们的快速魔方算法要隆重登场了,在此缺席感谢一下来自Netherlands的Jaap Scherphuis同学.看前面这个页面的第三名. 魔方表示法 咱们先看一串天书般的字母:UF UR UB UL ...

  3. [Python]不使用kociemba库解魔方

    [Python]不使用kociemba库解魔方 前言 思路 测试效果 部分代码 主程序:Python3.8 关键改动:Java 14.0.1 项目文件 前言 说到魔方,python有个现成的库koci ...

  4. 解魔方算法/Thislethwaite解魔方算法/降群法

    0.前言 主流的魔方解法,从入门的层先法,到进阶的CFOP.桥式乃至盲拧,都是从部分到整体的思路,逐块逐层还原魔方.但是Thislethwaite法不同,Thislethwaite法从整体出发,不断降 ...

  5. Jmeter识别登录验证码_使用百度AI图片识别技术

    Jmeter识别登录验证码_使用百度AI图片识别技术 一.环境准备 1.下载并引用以下Jar包 2.将下载的jar包放至Jmeter中的lib目录中即可使用 二.使用步骤 1.在获得验证码的请求后使用 ...

  6. python识别魔方色块_【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色...

    早上用百度搜了一下"颜色识别",多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科) 是一个基于BSD许可(开源)发行的跨平 ...

  7. 基于python的手写数字识别实验报告_联机手写数字识别实验报告

    1 联机手写数字识别设计 一.设计论述 模式识别是六十年代初迅速发展起来的一门学科. 由于它研究的是如何用机 器来实现人 ( 及某些动物 ) 对事物的学习. 识别和判断能力, 因而受到了很多科技 领域 ...

  8. python平稳性检验_时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)...

    时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python) 发布时间:2019-01-10 00:02, 浏览次数:620 , 标签: Python 导读: 本文介绍了数据平稳 ...

  9. python提取人物特征_基于图像人物面部表情识别的特征提取优化方法与流程

    本发明涉及一种基于图像人物面部表情识别的特征提取优化方法,主要利用基于统计特征提取的二维主成分分析法和改进的粒子群算法优化图像矩阵的解,属于图像处理.模式识别和计算机视觉交叉技术应用领域. 背景技术: ...

最新文章

  1. 去雾综述_【综述】图像去雾的前世今生
  2. 面向对象编程(Object Oriented Programming)概念总结及延伸(一)
  3. android 点对点语音,使用Android SIP Stack进行点对点SIP呼叫?
  4. 牛客网【每日一题】7月21日题目精讲—区间权值
  5. web前端技巧:如何在浏览器地址栏执行html代码
  6. hubbledotnet 查询提示:已添加了具有相同键的项
  7. c++并发操作mysql_文件数据库sqlite3 C++ 线程安全和并发
  8. apache mod_autoindex 详解
  9. 远程拨号换IP的方法
  10. 副业新风口:淘宝无货源,1天1小时!10个月全款买房!
  11. Vivado时序约束之—— set_max_delay、set_min_dealy(最大最小延迟约束)
  12. 学习方法之——费曼技巧学习
  13. 1^2+2^2+…+n^2求和公式推导
  14. 数据库在网站中的作用
  15. Linux查看服务器的cpu和内存的硬件信息
  16. Linux文件系统之链接文件
  17. Springboot 关闭或绕过 jwt用户验证
  18. 射线检测算法在游戏中应用
  19. js的垃圾回收和内存泄露
  20. 检测两点所确定直线上的像素坐标

热门文章

  1. 斯坦福大学教授,极力推荐5本python入门书籍,入门最快基础最好
  2. IMX6Q的官方uboot移植,并且把1G的DDR3升级成2G的DDR3,修改网络驱动
  3. 我们精心设计的CAD图纸怎么转换为JPG格式
  4. python以下是变量合法命名的是_Python变量命名规则(超级详细)
  5. 女儿心、女儿情、女儿城
  6. 蓝桥杯 2022 国赛 《最大数字》
  7. zookeeper下载以及zkClient的使用
  8. CAD电气制图:CAD软件中设备布置技巧
  9. SVM算法逻辑推导与使用实例
  10. 交叉验证的几个方法的解释(简单交叉验证、k折交叉验证、留一法)