解魔方神器開(kāi)源:攝像頭看一眼,就能還原全步驟
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。
魔方解不開(kāi)了怎么辦,讓程序來(lái)幫你。
只需用攝像頭把魔方的六個(gè)面掃描一遍就能直接給出還原步驟。

即使你的魔方不是標(biāo)準(zhǔn)配色或房間的照明情況特殊也可以通過(guò)顏色校準(zhǔn)模式來(lái)識(shí)別。

這款荷蘭小哥發(fā)布的3階魔方解算器“Qbr”已經(jīng)在GitHub上開(kāi)源。
小哥還貼心地把魔方公式中的步驟代號(hào)翻譯為人話,并且支持中文,可以直接按照描述操作。
中文是小哥自學(xué)的,他還給自己起了個(gè)中文名叫“金可明”。
解算結(jié)果大概是這樣的。
步驟數(shù): 20
復(fù)原教程: B2 U2 F' R U D' L' B' U L F U F2 R2 F2 D' F2 D R2 D2
1. 將魔方的后面旋轉(zhuǎn)180°。
2. 將魔方的頂層旋轉(zhuǎn)180°。
3. 將魔方的前面向左旋轉(zhuǎn)90°。
...
20.將魔方的底層向右旋轉(zhuǎn)90°。
安裝方法
使用Qbr需要你的電腦裝有Python3,Git以及一個(gè)攝像頭。
安裝方法如下
- $ git clone --depth 1 https://github.com/kkoomen/qbr.git
- $ cd qbr
- $ python3 -m venv env
- $ source ./env/bin/activate
- $ pip3 install -r requirements.txt
運(yùn)行時(shí)要注意每次運(yùn)行前都要激活虛擬環(huán)境
- $ source ./env/bin/activate
- $ ./src/qbr.py
操作也非常簡(jiǎn)單,可以先按L鍵循環(huán)切換語(yǔ)言到中文,C鍵進(jìn)入/退出顏色校準(zhǔn)模式。
掃描模式下按空格鍵保存識(shí)別好的一個(gè)面,6個(gè)面都識(shí)別好之后按esc就可以在終端里看到結(jié)果了。
△沒(méi)有魔方只能拿照片測(cè)試一下
如果需要將結(jié)果翻譯成“人話”,則運(yùn)行時(shí)加入?yún)?shù)“-n”即可。
解魔方的算法方面Qbr直接使用了開(kāi)源的Kociemba算法庫(kù),該算法可以在20步以內(nèi)還原任意3階魔方。
那么問(wèn)題來(lái)了,如何將攝像頭掃描的圖像輸入給算法呢?
攝像頭如何識(shí)別魔方?
Qbr使用開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù)OpenCV。
首先將圖像灰度化,稍微做一下模糊,然后用邊緣檢測(cè)識(shí)別出魔方小面的邊緣。

把所有邊緣加粗,使屬于一個(gè)邊緣的多條線可以合并。

將邊緣疊加到原始圖像上,使用OpenCV的approxPolyDP函數(shù)識(shí)別出閉合區(qū)域。

再去掉一些多余的輪廓,就得到了魔方的所有小面。

金可明在此基礎(chǔ)上改進(jìn)了形狀檢測(cè)算法,即使魔方小面帶有弧度、不是標(biāo)準(zhǔn)正方形也可以識(shí)別。

掃描好6個(gè)面后計(jì)算每個(gè)小面中顏色的平均值。

然后用CIDE2000算法計(jì)算出每個(gè)小面屬于哪種標(biāo)準(zhǔn)色。

最后按順序?qū)㈩伾幋a合成為一個(gè)字符串就可以作為魔方算法的輸入了。
下一步,機(jī)器人
金可明的GitHub頁(yè)面
金可明出生于荷蘭,自學(xué)中文后來(lái)到中國(guó)留學(xué)。
除了Qbr外他還編寫(xiě)過(guò)一個(gè)為代碼自動(dòng)生成文檔的Vim插件,并用文檔生成器(Documentation Generator)的英文字母開(kāi)頭給插件命名為“Doge”,獲得Github 500星好評(píng)。
作為程序員的他看到這個(gè)擰魔方只需要不到1秒的機(jī)器人后決定自己也要做一個(gè)。
△ Jay Flatland于2016年發(fā)布,0.9秒的成績(jī)打破了世界紀(jì)錄
現(xiàn)在軟件部分寫(xiě)好了,讓我們期待他何時(shí)能做出機(jī)器人吧。
Qbr項(xiàng)目地址:
https://github.com/kkoomen/qbr