找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 5022|回复: 1

解魔方机器人[四]-建立模型(下)

[复制链接]
发表于 2016-9-5 17:39:49 | 显示全部楼层 |阅读模式
本帖最后由 xvholly 于 2016-9-5 17:39 编辑

4.3 调整顺序

虽然魔方每个面都扫描完了,但是有没有发现什么问题?没错,色块的顺序有点乱,通常我们习惯下面这种顺序来表示:

  1.                    +--5--+
  2.                    |0 1 2|
  3.                    |3 4 5|
  4.                    |6 7 8|
  5. +--0--+--1--+--2--+--3--+
  6. |0 1 2|0 1 2|0 1 2|0 1 2|
  7. |3 4 5|3 4 5|3 4 5|3 4 5|
  8. |6 7 8|6 7 8|6 7 8|6 7 8|
  9. +-----+-----+-----+--4--+
  10.                    |0 1 2|
  11.                    |3 4 5|
  12.                    |6 7 8|
  13.                    +-----+
复制代码

调整顺序其实就是某两个色块进行对调,同样并没有什么难度,需要的只是耐心和细心。

程序设计
  1. # 输入未排序的魔方
  2. def scan_reshape(orignal):
  3.   result = np.zeros((6,9), np.uint8)
  4.   for i in range(6):
  5.     if i < 4:
  6.       result[i,0] = orignal[i,4]
  7.       result[i,1] = orignal[i,1]
  8.       result[i,2] = orignal[i,2]
  9.       result[i,3] = orignal[i,0]
  10.       result[i,4] = orignal[i,3]
  11.       result[i,5] = orignal[i,6]
  12.       result[i,6] = orignal[i,7]
  13.       result[i,7] = orignal[i,8]
  14.       result[i,8] = orignal[i,5]
  15.     else:
  16.       result[i,0] = orignal[i,4]
  17.       result[i,1] = orignal[i,8]
  18.       result[i,2] = orignal[i,5]
  19.       result[i,3] = orignal[i,2]
  20.       result[i,4] = orignal[i,1]
  21.       result[i,5] = orignal[i,0]
  22.       result[i,6] = orignal[i,3]
  23.       result[i,7] = orignal[i,6]
  24.       result[i,8] = orignal[i,7]

  25.   # 返回排好顺序的魔方
  26.   return result
复制代码


4.4 建立模型程序设计
  1. # 扫描3遍取平均值作为扫描结果,按照顺序建立魔方模型
  2. def buildup_cube_module():
  3.   for i in range(3):
  4.     ev3_tmp = scan_every_side()
  5.     ev3_arr_rgb += ev3_tmp/3

  6.   # RGB转HSV
  7.   ev3_arr_hsv = cv2.cvtColor(ev3_arr_rgb, cv2.COLOR_RGB2HSV)

  8.   # 取H值作为颜色区分的特征值
  9.   ev3_arr_h = ev3_arr_hsv[:,:,0]
  10.   h = ev3_arr_h.reshape(6*9)

  11.   # 按照H值所处排序位置,确定色块的颜色类别
  12.   pos = sort_pos(h).reshape(6, 9)

  13.   # 9种颜色分别用0-8的数字表示
  14.   for i in range(6):
  15.     for j in range(9):
  16.       h[pos[i,j]] = i
  17.   ev3_arr_h = h.reshape(6, 9)
  18.   ev3_cube = scan_reshape(ev3_arr_h)

  19.   # 返回魔方模型
  20.   return ev3_cube
复制代码


4.5 引申阅读

下面这种方法通过RGB颜色空间进行色块划分,虽然我并没有采用,但从理论上我觉得是说得通的,感兴趣的同学可以看看并试验。

由于魔方需要识别的颜色和色块(点)也较少,因此可以考虑直接采用与每个面中心点的RGB值比较的方式进行归类。

当魔方转动时,其6个面中心点的绝对位置其实是不发生变化的。如果你把魔方安装下面这个方向放置,会发现无论怎样转动上面(UP)的中心点永远是白色、前面(FRONT)的中心点永远是绿色……

而RGB值的色彩空间模型实际上是一个以R、G、B为坐标轴值的一个正方体。这样可以想象6个面中心点的颜色也就分布在这个正方体的6个位置。

其余的48个色块所对应的RGB值,应该与各中心点之一的值接进,比如:所有白色色块的RGB值与上面(UP)中心点的值基本接近、所有绿色色块的RGB值与前面(FRONT)中心点的值基本接近……这种颜色的接近反映在RGB空间模型上,可以很好的理解为正方体上面有6×8个点分别与此前6个点的距离比较近。而这个距离又可以理解为三维空间的欧几里得距离,通过公式容易计算得出:

  1. 颜色差异 =  √((色块R值-中心R值)^2 + (色块G值-中心G值)^2 + (色块G值-中心G值)^2)
复制代码

再对这48个差异值从小到大排序,前8位的色块就是与该中心点颜色相同的色块。

写在本章最后

如果你分步骤的执行程序会发现一个问题,就是色彩传感器经常无法对准每一个魔方色块,这也就直接导致了无法准确扫描到该色块的颜色,造成识别误差。这个问题目前还没有更好的解决办法,即使采用原作者的程序解开的成功率也并不高,原因就在于此。可以使用的办法就是多扫描几遍,或者在扫描时多取几个扫描点,最终取平均值作为扫描结果。



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2016-9-6 17:15:20 | 显示全部楼层
谢谢分享
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-3-29 00:52 , Processed in 0.144696 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表