private void QRCodeTimer_Tick(object sender, EventArgs e) { if (QRCodeBitmap == null) { return; } //把ColorFrame的wbData的資料從WriteableBitmap格式,轉成Bitmap格式,才能符合QRcode格式 ZXing.Result result = reader.Decode(BitmapToWriteableBitmap.BitmapFromWriteableBitmap(QRCodeBitmap)); if (result != null) { Console.WriteLine(result.Text); //這邊要檢查 List裡有包含單字的陣列 if (TaskWords.Contains(result.Text)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = result.Text }; Success_Change_word(this, returnPostureWords); Console.WriteLine("成功" + result.Text); FirebaseUpload.Upload(ActivityTitle, "正確", new ORcodeObject(result.Text, txtVocabulary.Text, 1)); } else { SoundPlay.PlaySoundFailed(); //System.Windows.Forms.MessageBox.Show(result.Text); Console.WriteLine("失敗" + result.Text); FirebaseUpload.Upload(ActivityTitle, "錯誤", new ORcodeObject(result.Text, txtVocabulary.Text, 1)); } } }
/// <summary> /// 語音辨識事件 /// </summary> private void SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { //if (StopDetect != true) { //Show Sppech Confidence number on screen //Show Sppech Confidence number on screen Speech_Confidence.Content = "Speaking Accuracy" + "\r\n" + e.Result.Confidence.ToString(); //設定語音信度門檻值 if (e.Result.Confidence >= BasicMethod.ConfidenceThreshold) { Console.WriteLine(e.Result.Text); //語音辨識跟單字比對 if (e.Result.Semantics.Value.ToString().ToLower() == vocabulary.Give_StudentsSentence(posture_number).ToLower()) { //Firebase上傳資料 FirebaseUpload.Upload(ActivityTitle, "正確", new Speech(txtVocabulary.Text.Trim(), e.Result.Confidence)); if (Select_Item.SetPeerSentenceGameMode == true) { //新增語音辨識信心度到List SpeechConfidenceList.Add(BasicMethod.GiveSpeechConfidenceScore(e.Result.Confidence)); Console.WriteLine("總分" + TotalTime); Console.WriteLine("語音分數" + BasicMethod.GiveSpeechConfidenceScore(e.Result.Confidence)); } //顯示正確圖示 Speech_Correct.Visibility = Visibility.Visible; //將語音辨識結果設為True Speech_Result = true; //播放正確音效 SoundPlay.PlaySoundCorrect(); //通知事件,只是為了再次呼叫 檢查正確與否的方法,所以PostureWords 設為空值 if (!Speech_Result == false && !Posture_Result == false) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "" }; Success_Change_word(this, returnPostureWords); } } else { //如果答錯就記錄到Firebase 但是也要設定門檻才不容易發生誤判 if (txtVocabulary.Text != null || e.Result.Confidence >= 0.35) { //Firebase上傳資料 FirebaseUpload.Upload(ActivityTitle, "錯誤", new Speech(txtVocabulary.Text.Trim(), e.Result.Semantics.Value.ToString(), e.Result.Confidence)); } } } } }
private void BtnOpenSelectItem_Click(object sender, RoutedEventArgs e) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = Input.Text }; Success_Change_word(this, returnPostureWords); }
/// <summary> /// 委派所註冊的方法,從雲端回傳的資料,傳送到這方法,比對單字跟臉部辨識的表情 /// </summary> private void SetFaceFeature(String face_feature) { Console.WriteLine(face_feature); this.FaceInfo.Content = face_feature; //Clear progressbar this.ImageUploadBar.Value = 0; this.ImageUploadBar.Visibility = Visibility.Collapsed; //Firebase上傳照片結果以及次數 if (txtVocabulary.Text != null) { FirebaseUpload.Upload(ActivityTitle, new Photo(txtVocabulary.Text.Trim(), face_feature, 1)); } if (TaskWords != null) { foreach (String List in StorageEmotionWords) { Console.WriteLine("單字" + StorageEmotionWords); Success_Change_word(this, BasicMethod.CheckEmotionWord_Sentence(List, face_feature)); } } if (face_feature.Contains("anger")) { //呼叫成功的方法 //Success_Change_word(this, new EventArgs()); ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Anger" }; //Success_Change_word(this, returnPostureWords); } else if (face_feature.Contains("surprise")) { //呼叫成功的方法 //Success_Change_word(this, new EventArgs()); ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Startled" }; //Success_Change_word(this, returnPostureWords); } Console.WriteLine(face_feature); }
/// <summary> /// 委派所註冊的方法,從雲端回傳的資料,傳送到這方法,比對單字跟臉部辨識的表情 /// </summary> private void SetFaceFeature(String face_feature) { Console.WriteLine(face_feature); this.FaceInfo.Content = face_feature; //Clear progressbar this.ImageUploadBar.Value = 0; this.ImageUploadBar.Visibility = Visibility.Collapsed; String Target = vocabulary.Give_Vocabulary(posture_number).ToLower(); if (face_feature.Contains("anger")) { //呼叫成功的方法 //Success_Change_word(this, new EventArgs()); ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Anger" }; Success_Change_word(this, returnPostureWords); } else if (face_feature.Contains("surprise")) { //呼叫成功的方法 //Success_Change_word(this, new EventArgs()); ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Startled" }; Success_Change_word(this, returnPostureWords); } Console.WriteLine(face_feature); }
private void NotifyEvent(ReturnPostureWords returnPostureWords) { Poseture_List(this, returnPostureWords); }
public void Poseture_Detected(Body body, String vocabulary, FaceFrameResult face_result) { if (face_result != null) { //頭部 var Head = body.Joints[JointType.Head]; //頭 var Neck = body.Joints[JointType.Neck]; //脖子 //手臂兩側 var RightHandTip = body.Joints[JointType.HandTipRight]; //右手頂部 var LeftHandTip = body.Joints[JointType.HandTipLeft]; //左手頂部 var RightHand = body.Joints[JointType.HandRight]; //右手 var LeftHand = body.Joints[JointType.HandLeft]; //左手 var RightThumb = body.Joints[JointType.ThumbRight]; //右手掌 var LeftThumb = body.Joints[JointType.ThumbLeft]; //左手掌 var RightWrist = body.Joints[JointType.WristRight]; //右手腕 var LeftWrist = body.Joints[JointType.WristRight]; //左手腕 var RightElbow = body.Joints[JointType.ElbowRight]; //右手臂 var LeftElbow = body.Joints[JointType.HandLeft]; //左手臂 var RightShoulder = body.Joints[JointType.ShoulderRight]; //右肩膀 var LeftShoulder = body.Joints[JointType.ShoulderLeft]; //左肩膀 //中間 var SpineShoulder = body.Joints[JointType.SpineShoulder]; //脊柱肩膀 var SpineMid = body.Joints[JointType.SpineMid]; //脊柱中間 var SpineBase = body.Joints[JointType.SpineBase]; //脊柱基礎 //下半身 var RightHip = body.Joints[JointType.HipRight]; //右髖關節 var LeftHip = body.Joints[JointType.HipLeft]; //左髖關節 var RightKnee = body.Joints[JointType.KneeRight]; //右膝蓋 var LeftKnee = body.Joints[JointType.KneeLeft]; //左膝蓋 var RightAnkle = body.Joints[JointType.AnkleRight]; //右腳踝 var LeftAnkle = body.Joints[JointType.AnkleLeft]; //左腳踝 var RightFoot = body.Joints[JointType.FootRight]; //右腳 var LeftFoot = body.Joints[JointType.FootLeft]; //左腳 //臉部 var LeftEye = face_result.FacePointsInColorSpace[FacePointType.EyeLeft]; var RightEye = face_result.FacePointsInColorSpace[FacePointType.EyeRight]; var Nose = face_result.FacePointsInColorSpace[FacePointType.Nose]; var LeftMouth = face_result.FacePointsInColorSpace[FacePointType.MouthCornerLeft]; var RightMouth = face_result.FacePointsInColorSpace[FacePointType.MouthCornerRight]; var LeftEyeClosed = face_result.FaceProperties[FaceProperty.LeftEyeClosed]; var RightEyeClosed = face_result.FaceProperties[FaceProperty.RightEyeClosed]; var MouthOpen = face_result.FaceProperties[FaceProperty.MouthOpen]; var Happy = face_result.FaceProperties[FaceProperty.Happy]; var Glasses = face_result.FaceProperties[FaceProperty.WearingGlasses]; //手部 var RightHandState = body.HandLeftState; var LeftHandState = body.HandRightState; switch (vocabulary) { #region 方位介係詞 case "Behind": if ((RightHand.Position.Y >= RightElbow.Position.Y) && (RightHand.Position.X < RightElbow.Position.X) && (RightElbow.Position.Y > RightShoulder.Position.Y) && (RightHand.Position.Z > RightElbow.Position.Z)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Behind" }; NotifyEvent(returnPostureWords); } break; case "Under": if ((RightHandTip.Position.Y - 0.05 <= RightKnee.Position.Y - 0.05 && RightElbow.Position.Y >= RightHandTip.Position.Y) || (LeftHandTip.Position.Y - 0.05 <= LeftKnee.Position.Y - 0.05 && LeftElbow.Position.Y >= LeftHandTip.Position.Y)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Under" }; NotifyEvent(returnPostureWords); } break; case "Over": if (RightHandTip.Position.Y >= Head.Position.Y || LeftHandTip.Position.Y >= Head.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Over" }; NotifyEvent(returnPostureWords); } break; case "Above": if (RightHand.Position.Y >= Head.Position.Y || LeftHand.Position.Y >= Head.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Above" }; NotifyEvent(returnPostureWords); } break; case "Below": if (RightHandTip.Position.Y - 0.05 <= RightKnee.Position.Y - 0.05 || LeftHandTip.Position.Y - 0.05 <= LeftKnee.Position.Y - 0.05) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Below" }; NotifyEvent(returnPostureWords); } break; case "In front of": if ((RightHandTip.Position.Z > RightShoulder.Position.Z || RightHandTip.Position.Y >= SpineShoulder.Position.Y) && (LeftHandTip.Position.Z > LeftShoulder.Position.Z || LeftHandTip.Position.Y >= SpineShoulder.Position.Y)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "In front of" }; NotifyEvent(returnPostureWords); } break; case "Down": if ((RightHandTip.Position.Y - 0.05 <= RightKnee.Position.Y - 0.05 && RightElbow.Position.Y >= RightHandTip.Position.Y) || (LeftHandTip.Position.Y - 0.05 <= LeftKnee.Position.Y - 0.05 && LeftElbow.Position.Y >= LeftHandTip.Position.Y)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Down" }; NotifyEvent(returnPostureWords); } break; #endregion #region 動詞 case "Relieve": if (LeftHandTip.Position.Y >= SpineShoulder.Position.Y && RightHandTip.Position.Y <= SpineMid.Position.Y && RightHandTip.Position.Y > SpineBase.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Relieve" }; NotifyEvent(returnPostureWords); } break; case "Scratch": if (LeftHandTip.Position.Y >= SpineShoulder.Position.Y - 0.05 && RightHandTip.Position.Y >= SpineShoulder.Position.Y - 0.05 && LeftHandTip.Position.Y <= Head.Position.Y && //左右手小於頭 RightHandTip.Position.Y <= Head.Position.Y && //左右手小於頭 LeftHandTip.Position.X > RightHandTip.Position.X && //左右手互相超過 RightHandTip.Position.X < LeftHandTip.Position.X) //左右手互相超過 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Scratch" }; NotifyEvent(returnPostureWords); } break; case "Comfort": if (LeftHandTip.Position.Y > SpineMid.Position.Y && RightHandTip.Position.Y > SpineMid.Position.Y && LeftHandTip.Position.Y < Head.Position.Y && RightHandTip.Position.Y < Head.Position.Y && LeftHandTip.Position.X >= RightShoulder.Position.X && RightHandTip.Position.X <= LeftShoulder.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Comfort" }; NotifyEvent(returnPostureWords); } break; case "Float": if (LeftHandTip.Position.Y > LeftShoulder.Position.Y && RightHandTip.Position.Y > RightShoulder.Position.Y && LeftHandTip.Position.Y < Head.Position.Y && RightHandTip.Position.Y < Head.Position.Y && LeftHandTip.Position.X < LeftShoulder.Position.X && RightHandTip.Position.X > RightShoulder.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Float" }; NotifyEvent(returnPostureWords); } break; case "Sprinkle": if (LeftHandTip.Position.Y < SpineMid.Position.Y && //左手介於肚子之間 LeftHandTip.Position.Y > SpineBase.Position.Y && //左手介於肚子之間 LeftHandTip.Position.X > LeftShoulder.Position.X && //左手小於左肩膀 RightHandTip.Position.Y > Head.Position.Y && //右手大於頭 RightHandTip.Position.X > RightShoulder.Position.X && //右手大於右肩膀 RightHandTip.Position.Y > RightElbow.Position.Y) //右手大於手肘 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Sprinkle" }; NotifyEvent(returnPostureWords); } break; case "Wander": if (LeftHandTip.Position.Y < LeftElbow.Position.Y && //左手小於左肘 RightHandTip.Position.Y > RightElbow.Position.Y && //右手大於右肘 RightHandTip.Position.Y > RightShoulder.Position.Y && //右手大於肩膀 RightKnee.Position.Y > LeftKnee.Position.Y && //右膝蓋大於左膝蓋 RightAnkle.Position.Y >= LeftKnee.Position.Y - 0.05) //右腳踝大於左膝蓋 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Wander" }; NotifyEvent(returnPostureWords); } break; case "Ban": if ((RightHand.Position.X - 0.05 <= LeftElbow.Position.X + 0.05) && (RightHand.Position.Y >= RightElbow.Position.Y) && (LeftHand.Position.Y >= LeftElbow.Position.Y)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Ban" }; NotifyEvent(returnPostureWords); } break; case "Destroy": if (LeftHandTip.Position.Y > LeftElbow.Position.Y && //左手大於左肘 LeftHandTip.Position.Y < Head.Position.Y && //左手小於頭 LeftHandTip.Position.Y > SpineMid.Position.Y && RightHandTip.Position.Z >= LeftHandTip.Position.Z && //右手大於左手的 Z RightHandTip.Position.Y < Head.Position.Y && //右手小於頭 RightHandTip.Position.Y > LeftHandTip.Position.Y) //右手高於左手 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Destroy" }; NotifyEvent(returnPostureWords); } break; case "Merge": if (LeftHandTip.Position.Y < Head.Position.Y && //左手小於頭 RightHandTip.Position.Y < Head.Position.Y && //右手小於頭 LeftHandTip.Position.Y > SpineMid.Position.Y && //左手大於中間 RightHandTip.Position.Y > SpineMid.Position.Y && //右手大於中間 LeftHandTip.Position.X >= RightHandTip.Position.X && //左右手互相碰起來 RightHandTip.Position.X <= LeftHandTip.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Merge" }; NotifyEvent(returnPostureWords); } break; case "Overcome": if (RightHandTip.Position.Y > RightElbow.Position.Y && //右手大於右肘 RightElbow.Position.Y > RightShoulder.Position.Y && //右肘大於右肩 RightHandTip.Position.X < RightElbow.Position.X) //右手X小於右肘 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Overcome" }; NotifyEvent(returnPostureWords); } break; case "Launch": if (LeftHandTip.Position.Y > Head.Position.Y && //左手大於頭 RightHandTip.Position.Y > Head.Position.Y && //右手大於頭 LeftHandTip.Position.X < LeftShoulder.Position.X && //左手超過左肩 RightHandTip.Position.X > RightShoulder.Position.X) //右手超過右肩 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Launch" }; NotifyEvent(returnPostureWords); } break; case "Establish": if (LeftHandTip.Position.Y > Head.Position.Y && //左手大於頭 RightHandTip.Position.Y > Head.Position.Y && //右手大於頭 LeftHandTip.Position.Y > RightHandTip.Position.Y && //左手大於右手 LeftHandTip.Position.X > LeftShoulder.Position.X && RightHandTip.Position.X < RightShoulder.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Establish" }; NotifyEvent(returnPostureWords); } break; case "Attach": if ((RightHandTip.Position.Z > RightShoulder.Position.Z || RightHandTip.Position.Y >= SpineShoulder.Position.Y) && (LeftHandTip.Position.Z > LeftShoulder.Position.Z || LeftHandTip.Position.Y >= SpineShoulder.Position.Y)) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Attach" }; NotifyEvent(returnPostureWords); } break; case "Hail": if (RightHandState == HandState.Closed && LeftHandState == HandState.Closed && LeftHandTip.Position.Y < Head.Position.Y && //左手小於頭 LeftHandTip.Position.Y > LeftElbow.Position.Y && //左手大於左肘 LeftHandTip.Position.X > LeftElbow.Position.X && //左手小於左肘 X RightHandTip.Position.Y > Head.Position.Y && //右手大於頭 RightHandTip.Position.Y > RightElbow.Position.Y) //右手大於右肘 { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Hail" }; NotifyEvent(returnPostureWords); } break; #endregion case "Chubby": if (LeftElbow.Position.Y > LeftHandTip.Position.Y && RightElbow.Position.Y > RightHandTip.Position.Y && LeftHandTip.Position.X < LeftShoulder.Position.X && RightHandTip.Position.X > RightShoulder.Position.X && LeftElbow.Position.X < LeftShoulder.Position.X && RightElbow.Position.X > RightShoulder.Position.X && RightHandTip.Position.Y > SpineBase.Position.Y && LeftHandTip.Position.Y > SpineBase.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Chubby" }; NotifyEvent(returnPostureWords); } break; case "Smelly": if (LeftHandTip.Position.Y > SpineShoulder.Position.Y && LeftHandTip.Position.Y < Head.Position.Y && RightHandTip.Position.Y > SpineShoulder.Position.Y && RightHandTip.Position.Y < Head.Position.Y && RightHandTip.Position.X <= LeftHandTip.Position.X && LeftHandTip.Position.X >= RightHandTip.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Smelly" }; NotifyEvent(returnPostureWords); } break; case "Unidentified": if (LeftHandTip.Position.X < LeftShoulder.Position.X && RightHandTip.Position.X > RightShoulder.Position.X && LeftHandTip.Position.Y > LeftShoulder.Position.Y && RightHandTip.Position.Y > RightShoulder.Position.Y && LeftHandTip.Position.Y < Head.Position.Y && RightHandTip.Position.Y < Head.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Unidentified" }; NotifyEvent(returnPostureWords); } break; case "Guilty": if (LeftHandTip.Position.Y > SpineShoulder.Position.Y && LeftHandTip.Position.Y > Head.Position.Y && RightHandTip.Position.Y > SpineShoulder.Position.Y && RightHandTip.Position.Y > Head.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Guilty" }; NotifyEvent(returnPostureWords); } break; case "Individual": if (RightHandState == HandState.Closed && LeftHandState == HandState.Closed && RightHandTip.Position.Y < Neck.Position.Y && LeftHandTip.Position.Y < Neck.Position.Y && RightHandTip.Position.Y >= SpineShoulder.Position.Y && LeftHandTip.Position.Y >= SpineShoulder.Position.Y && RightHandTip.Position.X < RightShoulder.Position.X && LeftHandTip.Position.X > LeftShoulder.Position.X) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Individual" }; NotifyEvent(returnPostureWords); } break; case "Depression": if (RightKnee.Position.Y > SpineBase.Position.Y && LeftKnee.Position.Y > SpineBase.Position.Y && LeftHandTip.Position.Y > SpineShoulder.Position.Y && LeftHandTip.Position.Y > Head.Position.Y && RightHandTip.Position.Y > SpineShoulder.Position.Y && RightHandTip.Position.Y > Head.Position.Y) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Depression" }; NotifyEvent(returnPostureWords); } break; case "Confidence": if (RightHandTip.Position.Y > RightElbow.Position.Y && //右手大於右肘 RightElbow.Position.Y > RightShoulder.Position.Y && //右肘大於右肩 RightHandTip.Position.X < RightElbow.Position.X && LeftHandTip.Position.Y > LeftElbow.Position.Y && //右手大於右肘 LeftElbow.Position.Y > LeftShoulder.Position.Y && //右肘大於右肩 LeftHandTip.Position.X > LeftElbow.Position.X && RightHandState == HandState.Closed && LeftHandState == HandState.Closed) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Confidence" }; NotifyEvent(returnPostureWords); } break; case "Happy": if (Happy == DetectionResult.Maybe) { } else if (Happy == DetectionResult.Yes) { ReturnPostureWords returnPostureWords = new ReturnPostureWords() { PostureWords = "Happy" }; NotifyEvent(returnPostureWords); } break; } } }