はじめに
12月に、私の所属する団体で、ピクシブさん協賛の部内ハッカソンが開催されました。
そこで私たちの作った"ボドゲアシスト"が、学生メンター最優秀賞、会場の全員が投票できるアイデア賞をいただきました。
この記事では、作成したモノの概要や使用技術について簡単に紹介をします。
動機
2024年10月、ニンテンドーミュージアムがオープンしました。
そこには、花札で遊べるこのような施設があります。
私はこれを見て、アナログゲームをアナログのまま遊びやすくする良い方法だと感じ、花札以外でもやりたいと思い、作ってみることにしました。
最初は認識もルールもシンプルなオセロでやってみることにしました。
概要
実際に遊んでいる動画です。
やっていることは、
- カメラで盤面を撮影
- OpenCVで盤面を認識
- アシスト(次の手,裏返す石)の位置を計算
- プロジェクターで投影
と、シンプルです。
ソースコードはこちら。
盤面認識
自分で方法を考えながら、こちらの記事を参考にしつつ、盤面を認識する方法を実装しました。
色々模索するも、ほとんどこの記事と同じ方法でやったので、大きな違いのみを簡潔に述べます。
石の位置の特定
上記記事では、切り取った正方形のうち、緑色以外の場所を石とみなしていました。
その方法だと白と黒で認識精度に差が生まれてしまったので、私は白と黒を分けて処理して石の位置を特定しました。
ソースコードの97-114行あたり。
石の色の特定
上記記事では、中心の周囲が狭い,広い場合でチェックしていました。
私は反射をある程度無視できる良い環境でやることを前提に、固定の四角形内の明るさのみで判断をしました。
(今考えると、これも白黒を分けた状態で処理してもよかった気もする。)
オセロの処理
認識した盤面でオセロをするだけの簡単な処理、では不十分なんです。
画像認識が常に正しくできるとは限らない、手などのノイズも入るのでできない前提で、遷移可能な盤面にしか進めないようにしています。
これもあり画像認識を少し簡易的に行っています。
具体的には、理想盤面を常に持っており、以下のような流れで処理をしています。
- 最初の盤面を取得
- 可能な手を表示
- 置ける位置に石が置かれた時、その場合の理想盤面に更新
- 現在盤面と理想盤面のと差分を表示
- 理想盤面になったら、2に戻る
上記動画では分からないが、
- 置けない場合は自動でパス
- 両者置けない場合はゲーム終了
の処理も実装してあります。
課題
- 手やその影などがノイズとなって認識が難しい時がある
- 上記の通り正しいオセロ以外は認めていないが、それでも誤認識してしまう時があるので石以外を弾きたい
- (箸等でプレイすれば、最低限のノイズを実現できた)
- 同じ色の石が1つも無いと正しく認識できない
- 相対的な面積で石を認識しているので、絶対的な面積で判断したい
- 円の検出で石を認識できなかったので、円でも上手くやりたい
おわりに
アナログとデジタルを融合させた、実際に触って楽しい作品を作ることができ、その上賞もいただいたので、たいへん充実したハッカソンとなりました。
ですが、今回OpenCVを初めて使用したのもあって、全体的な流れの計画や仕事の割り振りを上手くできず、すごく悔しく思っています。
今後このような機会があれば、そこで生かせるよう精進して参ります。
最後までお読みいただきありがとうございました。