26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

機械学習を使って、PCのカメラでザクを補足して撃てるようにしてみた。

Posted at

#クラウドファンディングでシューティングゲームを作る予定なので、カメラで敵を補足して撃てるようにしてみた。

ポケモンGOやドラクエウォークのような、現実世界を利用したシューティングゲームを企画しています。
肝心のシューティング部分を現在検討中で、センサで検知するのかカメラで検知するのか、検知する対象物は何か等を考えているところです。
今回は機械学習でザク(敵)を学習し、カメラにザクが映ったときに射撃ボタンを押すとLINENotifyから通知が送られるようにしてみました。

#構成
ファイル名

#Teachable Machineで画像認識のモデルを作成する

Teachable Machineの使い方は↓のリンクを参照
[【10分で出来る】Teachable Machineを使って簡単なじゃんけん判別アプリを作ってみた]
(https://qiita.com/sasao3/items/becdf981d8e9dea496e5)

ファイル名

#integromatでwebhooks→LINENotifyのシナリオを作成する

Integromatの使い方は↓のリンクを参照
[Integromatの使い方]
(https://qiita.com/nendocode/items/b3f9f9810a0dfd744dcf)
ファイル名

#コード(HTML)


<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>射撃ボタンクリックしたら、LINENotifyに通知するアプリ</title>
  </head>

  <body>
    <h1>ザクを撃て!!</h1>

    <!-- このapp内のみVue.jsの管理範囲です -->
    <div id="app">
      <p>{{ modelState }}</p>
      <p>{{ detectedName }}</p>
      <p><button v-on:click="onButtonClicked">射撃</button></p>
      <video id="myvideo" width="640" height="480" muted autoplay playsinline></video>
    </div>

    <!-- ml5.jsとVue.jsをCDNから読み込みます -->
    <script src="https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
      // 作成したモデルのURL
      const imageModelURL = 'Teachable Machineで作成したモデルのURL';
      let classifier;

      const app = new Vue({
        el: '#app',
        data: {
          modelState: 'モデルのロード中…',
          detectedName: '',
        },

        async mounted() {
          // カメラからの映像取得
          const stream = await navigator.mediaDevices.getUserMedia({
            audio: true,
            video: true,
          });

          // IDが"myvideo"であるDOMを取得
          const video = document.getElementById('myvideo');

          // videoにカメラ映像をセット
          video.srcObject = stream;

          // 自作モデルのロード
          classifier = ml5.imageClassifier(imageModelURL + 'model.json', video, () => {
            // ロード完了
            app.modelState = 'ロード完了!';
            console.log('Model Loaded!');
          });
        },

        methods: {
          onButtonClicked: function() {
            classifier.classify((err, results) => {
              console.log(results);
              if (results[0]) {
                if(results[0].label=='ザク'){
                  try {
                    const address = axios.get('integromatのwebhookのURL' + results[0].label + '&text=' + '10ポイント獲得!');
                  } catch (e){
                    console.log('integromat連携に失敗');
                    console.error(e);
                  }
                } else {
                  try {
                    const address = axios.get('integromatのwebhookのURL' + results[0].label + '&text=' + '味方を撃つなあああ!');
                  } catch (e){
                    console.log('integromat連携に失敗');
                    console.error(e);
                  } 
                }
                app.detectedName = "君が撃ったのは" + results[0].label + "だ!!";
              } else {
                app.detectedName = 'わからない...';
              }
            });
          },
        },

      });
      
    </script>
  </body>
</html>

#考察
・スマホでの実装方法を調べる必要がある
・学習データの集め方が難しい
 →プラモデル作って撮影すればサンプルたくさん取れそう。
  →プラモデル、、作るか。

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?