ビンゴカードを作る
ビンゴカードを作ります。リストからランダムに値を取り出す関数random.sampleを用いて、1~70までの数字の入ったリストから25個の数字をランダムに取り出し、それを5X5のマスに表示し、ビンゴカードを作ります。
こちらの記事の内容を使っています。
画像にグリッド線を引く
カラー画像を作成する
やること
- 単色の画像に線を引き、5 x 5の25マスのマス目画像を作成
- 1~70までの数字の入ったリストを作成
- リストから25個の数字を重複なく取り出す
- 取り出した数字をマス目画像に表示する
- 名前を付けてビンゴカードを保存
- 指定された枚数処理を繰り返す
使った関数
- numpy.zeros : 要素が0のndarrayの生成
- numpy.copy : ndarrayを複製
- random.sample : リストからランダム・重複なしに要素を取得
- numpy.array : リストをndarrayに変換
- ndarray.reshape : ndarrayの変形
- cv2.putText : 画像に文字を表示
- cv2.imwrite : 画像を保存する
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名"twins.jpg"で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
コード
import random #randomのインポート import numpy as np #numpyのインポート import cv2 #OpenCVのインポート img=np.zeros((500, 500, 3), np.uint8) #500x500x3要素の3次元ndarrayを生成し値を0に img[:,:,0:3]=[51,40,92] #全画素にBGR=51,40,92(ダークブラウン)を設定 #横線を引く:y100からy400まで100ピクセルおきに白い(BGRすべて255)横線を引く img[100:500:100, :, :] = 255 #縦線を引く:x100からx400まで100ピクセルおきに白い(BGRすべて255)縦線を引く img[:, 100:500:100, :] = 255 bingo = list(range(1,71)) #1~70まで70個の連続した数値からなるリスト'bingo'を生成 for i in range(3): #作るビンゴカード枚数分、繰り返す bingo_img=np.copy(img) #縦横線を引いた画像ingをbingo_imgにコピー #リスト'bingo'からランダムに25個の要素を重複なしに選択、リスト'bingo_25'に代入 bingo_25=random.sample(bingo, 25) bingo_25n=np.array(bingo_25) #リスト'bingo_25'をndarray'bingo_25n'に変換 bingo_5x_5x=bingo_25n.reshape(5,5) #ndarray'bingo_25n'を5行5列に変換 text_y=70 #文字表示位置のy座標 for y in range(5): #yを0~4まで繰り返す text_x=10 #文字表示位置のx座標 for x in range(5): #xを0~4まで繰り返す bingo_number=str(bingo_5x_5x[y,x]) #文字列bingo_numberを座標(text_x, text_y)にサイズ2、白、文字太さ3で描画 cv2.putText(bingo_img, bingo_number, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), thickness=3) text_x=text_x+100 #文字表示位置のx座標を100ピクセルずらす text_y=text_y+100 #文字表示位置のy座標を100ピクセルずらす save_filename='bingocard'+str(i)+'.png' #保存用ファイル名設定 bingocard0.png,bingocard1.pngのような連番 cv2.imwrite(save_filename,bingo_img) #bingo_imgを保存
実行結果
3枚のビンゴカードが画像ファイルとして保存されました
bingocard0.png
bingocard1.png
bingocard2.png
生成したデータは次のように画像まで変換しています。
1~70までのリスト
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]
そこから25個の数字をランダムに重複なしに取得したリスト
[21, 39, 33, 23, 24, 10, 17, 28, 5, 65, 18, 11, 22, 3, 43, 63, 27, 8, 13, 58, 46, 38, 69, 4, 35]
ndarrayに変換
[21 39 33 23 24 10 17 28 5 65 18 11 22 3 43 63 27 8 13 58 46 38 69 4 35]
5x5の二次元ndarrayに変換
[[21 39 33 23 24]
[10 17 28 5 65]
[18 11 22 3 43]
[63 27 8 13 58]
[46 38 69 4 35]]
画像に表示
bingocard2.png
以下のサイトを参考にさせていただきました
note.nkmk.me >> Pythonでリストからランダムに要素を選択するchoice, sample, choices
OpenCV-Python Tutorials >> 画像にテキストを書き加える