本帖最后由 xvholly 于 2016-9-5 17:39 编辑
4.3 调整顺序虽然魔方每个面都扫描完了,但是有没有发现什么问题?没错,色块的顺序有点乱,通常我们习惯下面这种顺序来表示: - +--5--+
- |0 1 2|
- |3 4 5|
- |6 7 8|
- +--0--+--1--+--2--+--3--+
- |0 1 2|0 1 2|0 1 2|0 1 2|
- |3 4 5|3 4 5|3 4 5|3 4 5|
- |6 7 8|6 7 8|6 7 8|6 7 8|
- +-----+-----+-----+--4--+
- |0 1 2|
- |3 4 5|
- |6 7 8|
- +-----+
复制代码
调整顺序其实就是某两个色块进行对调,同样并没有什么难度,需要的只是耐心和细心。 程序设计- # 输入未排序的魔方
- def scan_reshape(orignal):
- result = np.zeros((6,9), np.uint8)
- for i in range(6):
- if i < 4:
- result[i,0] = orignal[i,4]
- result[i,1] = orignal[i,1]
- result[i,2] = orignal[i,2]
- result[i,3] = orignal[i,0]
- result[i,4] = orignal[i,3]
- result[i,5] = orignal[i,6]
- result[i,6] = orignal[i,7]
- result[i,7] = orignal[i,8]
- result[i,8] = orignal[i,5]
- else:
- result[i,0] = orignal[i,4]
- result[i,1] = orignal[i,8]
- result[i,2] = orignal[i,5]
- result[i,3] = orignal[i,2]
- result[i,4] = orignal[i,1]
- result[i,5] = orignal[i,0]
- result[i,6] = orignal[i,3]
- result[i,7] = orignal[i,6]
- result[i,8] = orignal[i,7]
- # 返回排好顺序的魔方
- return result
复制代码
4.4 建立模型程序设计
- # 扫描3遍取平均值作为扫描结果,按照顺序建立魔方模型
- def buildup_cube_module():
- for i in range(3):
- ev3_tmp = scan_every_side()
- ev3_arr_rgb += ev3_tmp/3
- # RGB转HSV
- ev3_arr_hsv = cv2.cvtColor(ev3_arr_rgb, cv2.COLOR_RGB2HSV)
- # 取H值作为颜色区分的特征值
- ev3_arr_h = ev3_arr_hsv[:,:,0]
- h = ev3_arr_h.reshape(6*9)
- # 按照H值所处排序位置,确定色块的颜色类别
- pos = sort_pos(h).reshape(6, 9)
- # 9种颜色分别用0-8的数字表示
- for i in range(6):
- for j in range(9):
- h[pos[i,j]] = i
- ev3_arr_h = h.reshape(6, 9)
- ev3_cube = scan_reshape(ev3_arr_h)
- # 返回魔方模型
- 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个点的距离比较近。而这个距离又可以理解为三维空间的欧几里得距离,通过公式容易计算得出: - 颜色差异 = √((色块R值-中心R值)^2 + (色块G值-中心G值)^2 + (色块G值-中心G值)^2)
复制代码再对这48个差异值从小到大排序,前8位的色块就是与该中心点颜色相同的色块。 写在本章最后如果你分步骤的执行程序会发现一个问题,就是色彩传感器经常无法对准每一个魔方色块,这也就直接导致了无法准确扫描到该色块的颜色,造成识别误差。这个问题目前还没有更好的解决办法,即使采用原作者的程序解开的成功率也并不高,原因就在于此。可以使用的办法就是多扫描几遍,或者在扫描时多取几个扫描点,最终取平均值作为扫描结果。
|