文/IT可達鴨
圖/IT可達鴨、網絡
前言還記得幾年前非常火的一個科學真人秀節目《最強大腦》嗎?它的第一個挑戰項目是魔方牆,魔方牆長什麼樣子?它有哪些規則?
首先,它是一個“找茬遊戲”的升級版,就是從兩幅一樣魔方牆中,找出其中不一樣的色塊所在的位置。
為了方便大家更清楚的認識這個遊戲,我們就稱它為“魔方牆找茬”遊戲。(看到這裡的朋友,不要着急哈,認真看下去,最後有彩蛋。)
圖片來自網絡
魔方牆找茬其實,我們普通人經過訓練,也可以做到從兩面魔方牆中尋找到不一樣的色塊。那麼該怎麼做呢?
我們先從基礎做起,先來個簡單版的“魔方牆找茬”。
初級魔方牆找茬
是不是非常簡單,隻要一眼掃過去,就能發現第三行,第四列的色塊不一樣。
中級魔方牆找茬
這個時候,就沒那麼簡單了。那有的朋友就說,隻要我細心,就一定可以看出來。是的,一行一行地掃描下來,細心的朋友會發現,最後一行,第六列的色塊不一樣。
高級魔方牆找茬
這個花時間去看容易看花,那麼我們就應該重新審視這個遊戲,尋找一個可以解決的可靠方法。
不過,在此之前,你可能會問,我想研究“魔方牆找茬”,但是這個“魔方牆找茬”遊戲去哪裡下載呀?
不用擔心,小編剛好會一點點編程,給你寫一個魔方牆找茬的遊戲軟件,來,直接上代碼。
python版本: 3.6.0
編輯器: pycharm
項目所需要的環境安裝包
pip install numpy
pip install opencv-python
要先安裝numpy,再安裝opencv-python。
# encoding:utf-8
import cv2
import numpy as np
import random
color_list = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)
cv2: 是一個強大的圖像處理庫 opencv, 據說人臉識别、視頻處理等操作都可以做到。
numpy: 是一個擴展包,支持大量的維度數組與矩陣運算,包含大量數學函數。
color_list: 是魔方牆找茬遊戲的出現的所有色塊,這裡小編隻給了六種顔色,大家可以根據自己的需求,增加新的顔色,顔色越多,難度越大喲。
def show_mixed(row, col, min_cube_size, windows_name = 'bgr_img'):
"""
展示兩個顔色矩陣
:param row:
:param col:
:param windows_name:
:return:
"""
img = np.ones((min_cube_size*row, min_cube_size*col), dtype=np.uint8)
img2 = np.ones((min_cube_size * row, min_cube_size * col), dtype=np.uint8)
bgr_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
bgr_img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
for i in range(row):
tmp_row_start, tmp_row_end = i * min_cube_size, (i 1) * min_cube_size
for j in range(col):
tmp_col_start, tmp_col_end = j * min_cube_size, (j 1) * min_cube_size
tmp_color = random.choice(color_list) # 随機選一個顔色
bgr_img[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
# 随機選一個坐标
x, y = random.randint(0, row-1), random.randint(0, col-1)
tmp_row_start, tmp_row_end = x * min_cube_size, (x 1) * min_cube_size
tmp_col_start, tmp_col_end = y * min_cube_size, (y 1) * min_cube_size
while True:
tmp_color = random.choice(color_list) # 随機選一個顔色
if bgr_img2[tmp_row_start 5, tmp_col_start 5][0] == tmp_color[0] and \
bgr_img2[tmp_row_start 5, tmp_col_start 5][1] == tmp_color[1] and \
bgr_img2[tmp_row_start 5, tmp_col_start 5][2] == tmp_color[2]:
continue
else:
bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
break
cv2.imshow(windows_name "01", bgr_img )
cv2.imshow(windows_name "02", bgr_img2 )
return x 1, y
利用numpy的矩陣切片操作,給每個色塊進行上色。同時利用随機函數,随即選定一個坐标,藏入找茬遊戲的答案。
if __name__ == '__main__':
grade_dict = {"超簡單":5, "簡單": 15, "中等": 30, "難": 60} # 魔方牆的大小
cube_size_dict = {"超簡單":40, "簡單":25, "中等": 18, "難": 15} # 每個色塊的像素大小
grade_name = '中等'
x, y = show_mixed(grade_dict[grade_name], grade_dict[grade_name], cube_size_dict[grade_name], 'bg_01')
print( "x=%d, y=%d" % (x, y) )
cv2.waitKey(
在主函數中,自定義難度參數,這裡因為屏幕大小的限制,我把最難的設置為60*60的色塊魔方牆。如果你的屏幕夠大,可以設置成《最強大腦》裡的魔方牆尺寸。
至此,生成魔方牆的軟件就做好了,你可以随時生成多個“魔方牆找茬”的圖,進行訓練。
結語最後,相信很多朋友會問,有什麼方法可以快速找到答案?其實,很簡單,使用裸眼3D眼。就是小時候大家經常玩的“鬥雞眼”。
使用“3D”眼,把兩幅圖重疊在一起,剛開始的時候,會比較模糊,這個時候需要盯住,圖片慢慢清晰起來。這時候,你會發現“魔方牆”中有一個色塊一直在閃,而這個色塊,就是你要找的答案。
如果有疑問想獲取源碼,可以關注後,在後台私信我,回複:python魔方牆。 我把源碼發你。持續關注"IT可達鴨",每天除了分享有趣Python源碼,還會介紹NLP算法。最後,感謝大家的閱讀,祝大家工作生活愉快!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!