前提・実現したいこと
以下のサイトを参考にして、FaceAPIとVue.jsで感情認識アプリを作成したいと考えております
https://qiita.com/hideyuki_kai/items/d36563efb3ef15997462
コードをまずはコピペで作成して、動作確認をしようとしたところ、
下記のエラーをconsoleが吐いております。
Cannot read property 'use' of undefined
発生している問題・エラーメッセージ
Cannot read property 'use' of undefined
該当のソースコード
<template id="main"> <div id="app"> <canvas ref="canvas" id="emo_canvas" width="400" height="400"></canvas> <div> <video ref="video" id="video" width="400" height="400" playsinline muted autoplay></video> </div> </div> </template> <script> import Vue from 'vue' import Axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios, Axios) export default ({ template: '#main', data() { return { video: {}, canvas: {}, captures: [], testTimer: '', }; }, mounted() { //カメラを起動し、映像をvideoタグ内に表示 this.video = this.$refs.video if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({audio: false, video: true}) .then(stream => { this.video.srcObject = stream this.video.play() }) } console.log(this.$refs.canvas) // console.log(this.$refs.canvas) /* eslint-disable */ this.canvas = this.$refs.canvas this.testTimer = setInterval(() => { // console.log(this.$refs.canvas) let context = this.canvas.getContext("2d").drawImage(this.video, 0, 0, 400, 240) this.captures.push(this.canvas.toDataURL("image/png")) //撮った画像をcaptures配列に格納する let subscriptionKey = "951ca53d72ea41ac82f9697c50456994"; let uriBase = "https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect"; let params = { "returnFaceId": "true", "returnFaceLandmarks": "false", "returnFaceAttributes": "emotion" }; /* eslint-disable */ //配列最後に追加された画像のフォーマットを変換し、imgURL変数に代入する const imgURL = this.makeblob(this.captures[this.captures.length - 1]) //imgURLの画像をFaceAPIに送信 Axios.post( uriBase + "?returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,emotion", imgURL, { headers: { "Content-Type": "application/octet-stream", "Ocp-Apim-Subscription-Key": subscriptionKey, } }, ) .then(response => { console.log(response.data[0].faceAttributes.emotion) }) .catch(error => { // console.log(error.response) }); }, 5000); }, methods: { makeblob: function (dataURL) { let BASE64_MARKER = ';base64,'; if (dataURL.indexOf(BASE64_MARKER) == -1) { let parts = dataURL.split(','); let contentType = parts[0].split(':')[1]; let raw = decodeURIComponent(parts[1]); return new Blob([raw], {type: contentType}); } let parts = dataURL.split(BASE64_MARKER); let contentType = parts[0].split(':')[1]; let raw = window.atob(parts[1]); let rawLength = raw.length; let uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], {type: contentType}) } } }); </script>
試したこと
該当するソースコードに関することは一通り調べましたが一向に分からずでした
補足情報(FW/ツールのバージョンなど)
vuecli
canvas
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。