简介
本项目运用了基础的 Opencv 图像处理算法 来实现魔方色块的识别并判断颜色。 用户可以通过将魔方举在摄像机的前方来让机器自动将魔方的色块录入数据,然后系统将会依靠用户录入的数据来产生当前魔方的解法,并以动画的形式展现出来。
图形用户界面展示:
如何使用
使用到的库:
- Opencv
- Numpy
- Tkinter
在 Anaconda 环境下安装库:
conda install -c anaconda tk
conda install -c conda-forge numpy
conda install -c conda-forge opencv
配置完环境后:
在已具备所有需要的库之后,到 Rubik-s-Cube-Scanner-Solver 将该repo下的 RubiksCubeScanner 路径克隆到电脑中,然后使用python3 运行 client_gui.py 即可。
当该代码第一次运行时,系统需要创建解魔方需要使用到的表格,一般需要花半个小时到一个小时,请耐心等待,并且会占用额外的80MB左右的硬盘空间。此后执行则不需要创建列表,图形化用户界面会直接显示。
当用户界面显示,用户可以直接用客户端里的色盘来给魔方上色,也可以点击 “Turn on cam" 来打开摄像头,让摄像头来自动识别+读入当前魔方的内容。
在整个魔方已经被填充后,点击 ”Solve“ 系统将会连接到之前已经创建的列表并开始解输入的魔方。输出的解法的步骤数会在20步以内。
在魔方已经被解完后,点击 ”Animate“ 即可让魔方“动起来”,作者提前制作的魔方动画将会开始播放解法。左下角可拖动的块可以用来调节动画播放的速度。
实现步骤
本项目可以大致地分为三个步骤 :
1. 检测并录入魔方的内容
2. 生成已录入魔方的解法
3. 创建可以展示给用户的魔方动画
接下来的文章将会对每一个步骤,尤其是第一个步骤进行详细的分解。
1. 检测并录入魔方的内容
识别魔方色块
为了减少不必要的运算,在窗体程序的摄像机读取的视屏中间画有一个正方形,所有算法在该正方形中运行。使用 ROI(Region of Interest) 提升运算效率是非常实用的算法优化。
一张普通的彩色图片在每个像素含有一个 (0-255,0-255,0-255) 的数组, 也就是说在一个像素可以有 256x25