查看原文
其他


现在程序猿们的娱乐方式是越来越多样,各种游戏主机和游戏实现一次次的打破玩家想象的上限,但是无论技术怎么发展,有些经典的玩意永远不会过时,甚至会和技术完美地结合起来。

魔方,相信大多数程序猿小时候都玩过,最经典最广为流传的就是下面这种3阶魔方。

要想把魔方玩的好,除了反应快、记性好,还要有相当的空间想象能力和推理能力,像这样好玩又益智的玩具,也难怪可以无视电子游戏的崛起,一直流传至今。

而随着科学技术的发展,一部分程序猿想着如何利用程序最快速的拼完一个魔方,美国堪萨斯市软件工程师Paul Rose和Jay Flatland研制的机器人仅用时0.9秒就解开了魔方,首次打破该项世界纪录。随后,德国工程师Albert Beet研制的一款Sub1机器人仅用时0.887秒解开了魔方,再一次刷新该项纪录。

今天要给大家介绍的就是GitHub上一款开源的3阶魔方解算器Qbr

Qbr是一款用Python 3和OpenCV编写的魔方解算程序,可以根据摄像头扫描魔方最终给出一个魔方的完整解算步骤。

开发者是一位荷兰小哥KIM,中文名金可明,金小哥是一位非常喜欢中国的外国友人,自学中文后来到中国留学。考虑到中国程序猿的语言情况,金小哥还把魔方公式中的步骤代号翻译为中文,只需要用摄像头对着魔方进行扫描,通过颜色校准模式来识别,程序会给出最终的操作步骤,非常神奇。最终结果就像下面这样:

步骤数: 20
复原教程:

1. 将魔方的后面旋转180°。
2. 将魔方的顶层旋转180°。
3. 将魔方的前面向左旋转90°。
...
20.将魔方的底层向右旋转90°。

那如何使用这款3阶魔方解算器Qbr

其实也非常简单,只需要自己的电脑安装好了Python3,Git以及一个摄像头就可以满足使用要求了。

安装命令如下:

$ git clone --depth 1 https://github.com/kkoomen/qbr.git
cd qbr
 source ./env/bin/activate
$ pip3 install -r requirements.txt

运行时要需要激活虚拟环境,命令如下:

source ./env/bin/activate 
$ ./src/qbr.py

操作方式也非常简单,在右上角可以看到当前的接口语言,可以先将环境切换至中文(L键),目前支持以下多种语言模式。最让天朝程序猿开心的就是里面包含了中文~

然后按C键进入颜色校准模式,开始让魔方每一个位面的扫描,扫描完成一个位面之后按空格键保存,等6个位面都识别好了之后,按esc键就可以看到最终结果步骤,左下角会显示扫描的边数。这样,用户就可以知道在按esc键之前是否已扫描了所有面。记得运行时加入参数“-n”或者“--normalize”,这样输出的结果才是“人类可读”的格式。

何谓人类可读?那就例如:

R将是:右转四分之一圈。

F2将是:将正面旋转180度。

解魔方的算法Qbr直接使用了开源的Kociemba算法库,这个算法保障了在20步以内还原任意3阶魔方。同时,前文提到的OpenCV是一套开源的计算机视觉库,从而保障了摄像头识别魔方的完成。

我们一起看下实施原理:

第一步:加载图像,使其变灰,稍微模糊,然后使用Canny边缘检测来定位所有边缘。

self.image = cv2.imread(filename)
    gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (3, 3), 0)
    canny = cv2.Canny(blurred, 20, 40)

第二步:稍微放大线条,这会使线条变粗,从而更容易找到正方形的轮廓。

 kernel = np.ones((3,3), np.uint8)
    dilated = cv2.dilate(canny, kernel, iterations=2)

然后,第三步,OpenCV能够找到图像中的所有轮廓,其中轮廓定义为“连接所有连续点(沿边界)的曲线,具有相同的颜色或强度”。

(contours, hierarchy) = cv2.findContours(dilated.copy(), 
                                         cv2.RETR_TREE,
                                         cv2.CHAIN_APPROX_SIMPLE)

第四步,紧接着,降低轮廓形状的复杂性。通过OpenCV的approxPolyDP来实现这一点,简而言之,它近似于轮廓的形状。在下图中,轮廓同样为蓝色,但其近似值为红色。

第五步,消除所有不是正方形的轮廓

最后,等处理完所有六个边的图像,就得到了每个正方形的RGB(红、绿、蓝)值,就像这样:

再接着是获取这些RGB值并确定正方形属于哪一侧。使用CIEDE2000算法计算两种颜色之间的距离,最终获得的结果是精确地确定每个正方形属于哪一边。

是不是觉得整个过程,妙不可言,好了,今天的内容先到这里,小伙伴们是不是都想试试这套解魔方算法,看看是不是真的那么神奇?那就赶紧:

点击下方卡片,关注公众号“TJ君

回复“魔方”,获取项目下载地址




往期推荐

又一个可以弄垮iPhone手机的漏洞!不要乱试...
又在GitHub上挖到个宝藏:Switch模拟器!
暴雪来送大礼了,速领!




大家好,我是TJ

一个励志推荐10000款开源项目与工具的程序员

欢迎关注我,了解更多好玩、有趣的科技资讯

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存