前提・実現したいこと
現在,Mediapipeというライブラリを用いてカメラに写った手の検出とその座標の取得をおこなおうとしています.
MediaPipe Hands JavaScript Solution API
上記のページにあるJavascriptのコードを参考に,MediapipeライブラリをCDNで読み込みJavascriptを使って検出された手の座標を得ようとしているのですが.関数内で得られた座標を関数の外に出すことができません.
問題点・試したこと
以下のjavascriptコードにて,function onResults(results)
という関数内のfor文中で得られたlandmarks
という値を関数の外(もっといえばasync funcion main()
の中)で使用したいです.
しかし,グローバル変数で宣言したconst landmark
に代入してもうまくいきません(関数内でconsole.logした場合はちゃんと確認できました).
hands.onResults(onResults)
がおそらくその関数を呼び出しているようなので,landmark=hands.onResults(onResults)とし関数内にreturn landmarkを入れたりとしてみましたが依然うまくいきませんでした.
そもそもhandsというコンストラクタにonResultsという関数をつけてさらに引数にonResultsをいれるという構造が全く理解出来ません.
フロントエンド全般に関して初心者ですが,何卒解決方法をご教示いただきたいです.
該当のソースコード(抜粋)
html
1<html> 2<head> 3 <meta charset="utf-8"> 4 <script src="https://cdn.jsdelivr.net/npm/@mediapipe/camera_utils/camera_utils.js" crossorigin="anonymous"></script> 5 <script src="https://cdn.jsdelivr.net/npm/@mediapipe/control_utils/control_utils.js" crossorigin="anonymous"></script> 6 <script src="https://cdn.jsdelivr.net/npm/@mediapipe/drawing_utils/drawing_utils.js" crossorigin="anonymous"></script> 7 <script src="https://cdn.jsdelivr.net/npm/@mediapipe/hands/hands.js" crossorigin="anonymous"></script> 8 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"></script> 9</head> 10 11<body> 12 <div class="container"> 13 <video class="input_video"></video> 14 </div> 15</body> 16</html>
javascript
1<script type="module"> 2const videoElement = document.getElementsByClassName('input_video')[0]; 3 4const landmark; 5 6function onResults(results) { 7 if (results.multiHandLandmarks) { 8 for (const landmarks of results.multiHandLandmarks) { 9 landmark = landmarks; 10 } 11 } 12} 13 14const hands = new Hands({locateFile: (file) => { 15 return `https://cdn.jsdelivr.net/npm/@mediapipe/hands/${file}`; 16}}); 17hands.setOptions({ 18 maxNumHands: 2, 19 modelComplexity: 1, 20 minDetectionConfidence: 0.5, 21 minTrackingConfidence: 0.5 22}); 23 24hands.onResults(onResults); 25 26const camera = new Camera(videoElement, { 27 onFrame: async () => { 28 await hands.send({image: videoElement}); 29 }, 30 width: 1280, 31 height: 720 32}); 33camera.start(); 34 35async function main(){ 36 //このなかでlandmarkを使いたい 37} 38 39</script>
修正後のコードとコンソール画面
javascript
1async function main() { 2 let results = await new Promise(resolve => { 3 hands.onResults(resolve); 4 }); 5 let landmark; 6 if (results.multiHandLandmarks) { 7 for (const landmarks of results.multiHandLandmarks) { 8 landmark = landmarks; 9 console.log(landmark); 10 } 11 } 12} 13main(); 14
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/03 03:48
2021/12/03 04:13
2021/12/05 14:52