/// <summary> /// 特徴量をだす /// </summary> private bool MakeFeatureValue(IplImage img, ref PartsRectInfo input_info, out FeatureValue output_info) { //仮に代入 output_info.basepoint = new CvPoint(0, 0); output_info.BothEyeDistance = 0; output_info.LeftEyeValueL = 0; output_info.LeftEyeValueR = 0; output_info.RightEyeValueL = 0; output_info.RightEyeValueR = 0; output_info.NoseLValueL = 0; output_info.NoseLValueR = 0; output_info.MouthLValueL = 0; output_info.MouthLValueR = 0; output_info.ID = 0; //パーツがすべてそろっているかの確認 if (input_info.RightEye.X == 0) { return false; } if (input_info.LeftEye.X == 0) { return false; } if (input_info.Nose.X == 0) { return false; } if (input_info.Mouth.X == 0) { return false; } //瞳の間の場所を基点として各パーツとの比率をとる //(パーツ座標と基点との距離)/瞳の間の距離を学習データとする int LeftEyeCenterX = input_info.LeftEye.X + input_info.LeftEye.Width / 2; int LeftEyeCenterY = input_info.LeftEye.Y + input_info.LeftEye.Height / 2; int RightEyeCenterX = input_info.RightEye.X + input_info.RightEye.Width / 2; int RightEyeCenterY = input_info.RightEye.Y + input_info.RightEye.Height / 2; //右目の中心と左目の中心を結んだ線の中点が基準点。 output_info.basepoint.X = (LeftEyeCenterX + RightEyeCenterX) / 2; output_info.basepoint.Y = (LeftEyeCenterY + RightEyeCenterY) / 2; //目と目の距離をとる output_info.BothEyeDistance = makeTwoPointDistance(LeftEyeCenterX, RightEyeCenterX, LeftEyeCenterY, RightEyeCenterY); //基準点から各パーツの右端、左端までの距離をとる output_info.LeftEyeValueL = makeTwoPointDistance(input_info.LeftEye.X, output_info.basepoint.X, input_info.LeftEye.Y, output_info.basepoint.Y); output_info.LeftEyeValueR = makeTwoPointDistance(input_info.LeftEye.X + input_info.LeftEye.Width, output_info.basepoint.X, input_info.LeftEye.Y, output_info.basepoint.Y); output_info.RightEyeValueL = makeTwoPointDistance(input_info.RightEye.X, output_info.basepoint.X, input_info.RightEye.Y, output_info.basepoint.Y); output_info.RightEyeValueR = makeTwoPointDistance(input_info.RightEye.X + input_info.RightEye.Width, output_info.basepoint.X, input_info.RightEye.Y, output_info.basepoint.Y); output_info.NoseLValueL = makeTwoPointDistance(input_info.Nose.X, output_info.basepoint.X, input_info.Nose.Y, output_info.basepoint.Y); output_info.NoseLValueR = makeTwoPointDistance(input_info.Nose.X + input_info.Nose.Width, output_info.basepoint.X, input_info.Nose.Y, output_info.basepoint.Y); output_info.MouthLValueL = makeTwoPointDistance(input_info.Mouth.X, output_info.basepoint.X, input_info.Mouth.Y, output_info.basepoint.Y); output_info.MouthLValueR = makeTwoPointDistance(input_info.Mouth.X + input_info.Mouth.Width, output_info.basepoint.X, input_info.Mouth.Y, output_info.basepoint.Y); //基準点からパーツまでの距離と瞳間距離の比率を特徴量とする output_info.LeftEyeValueL /= output_info.BothEyeDistance; output_info.LeftEyeValueR /= output_info.BothEyeDistance; output_info.RightEyeValueL /= output_info.BothEyeDistance; output_info.RightEyeValueR /= output_info.BothEyeDistance; output_info.NoseLValueL /= output_info.BothEyeDistance; output_info.NoseLValueR /= output_info.BothEyeDistance; output_info.MouthLValueL /= output_info.BothEyeDistance; output_info.MouthLValueR /= output_info.BothEyeDistance; return true; }
/// <summary> /// 特徴量をだす /// </summary> private bool MakeFeatureValue(IplImage img, ref PartsRectInfo input_info, out FeatureValue output_info) { //仮に代入 output_info.basepoint = new CvPoint(0, 0); output_info.BothEyeDistance = 0; output_info.LeftEyeValueL = 0; output_info.LeftEyeValueR = 0; output_info.RightEyeValueL = 0; output_info.RightEyeValueR = 0; output_info.NoseLValueL = 0; output_info.NoseLValueR = 0; output_info.MouthLValueL = 0; output_info.MouthLValueR = 0; output_info.ID = 0; //パーツがすべてそろっているかの確認 if (input_info.RightEye.X == 0) { return(false); } if (input_info.LeftEye.X == 0) { return(false); } if (input_info.Nose.X == 0) { return(false); } if (input_info.Mouth.X == 0) { return(false); } //瞳の間の場所を基点として各パーツとの比率をとる //(パーツ座標と基点との距離)/瞳の間の距離を学習データとする int LeftEyeCenterX = input_info.LeftEye.X + input_info.LeftEye.Width / 2; int LeftEyeCenterY = input_info.LeftEye.Y + input_info.LeftEye.Height / 2; int RightEyeCenterX = input_info.RightEye.X + input_info.RightEye.Width / 2; int RightEyeCenterY = input_info.RightEye.Y + input_info.RightEye.Height / 2; //右目の中心と左目の中心を結んだ線の中点が基準点。 output_info.basepoint.X = (LeftEyeCenterX + RightEyeCenterX) / 2; output_info.basepoint.Y = (LeftEyeCenterY + RightEyeCenterY) / 2; //目と目の距離をとる output_info.BothEyeDistance = makeTwoPointDistance(LeftEyeCenterX, RightEyeCenterX, LeftEyeCenterY, RightEyeCenterY); //基準点から各パーツの右端、左端までの距離をとる output_info.LeftEyeValueL = makeTwoPointDistance(input_info.LeftEye.X, output_info.basepoint.X, input_info.LeftEye.Y, output_info.basepoint.Y); output_info.LeftEyeValueR = makeTwoPointDistance(input_info.LeftEye.X + input_info.LeftEye.Width, output_info.basepoint.X, input_info.LeftEye.Y, output_info.basepoint.Y); output_info.RightEyeValueL = makeTwoPointDistance(input_info.RightEye.X, output_info.basepoint.X, input_info.RightEye.Y, output_info.basepoint.Y); output_info.RightEyeValueR = makeTwoPointDistance(input_info.RightEye.X + input_info.RightEye.Width, output_info.basepoint.X, input_info.RightEye.Y, output_info.basepoint.Y); output_info.NoseLValueL = makeTwoPointDistance(input_info.Nose.X, output_info.basepoint.X, input_info.Nose.Y, output_info.basepoint.Y); output_info.NoseLValueR = makeTwoPointDistance(input_info.Nose.X + input_info.Nose.Width, output_info.basepoint.X, input_info.Nose.Y, output_info.basepoint.Y); output_info.MouthLValueL = makeTwoPointDistance(input_info.Mouth.X, output_info.basepoint.X, input_info.Mouth.Y, output_info.basepoint.Y); output_info.MouthLValueR = makeTwoPointDistance(input_info.Mouth.X + input_info.Mouth.Width, output_info.basepoint.X, input_info.Mouth.Y, output_info.basepoint.Y); //基準点からパーツまでの距離と瞳間距離の比率を特徴量とする output_info.LeftEyeValueL /= output_info.BothEyeDistance; output_info.LeftEyeValueR /= output_info.BothEyeDistance; output_info.RightEyeValueL /= output_info.BothEyeDistance; output_info.RightEyeValueR /= output_info.BothEyeDistance; output_info.NoseLValueL /= output_info.BothEyeDistance; output_info.NoseLValueR /= output_info.BothEyeDistance; output_info.MouthLValueL /= output_info.BothEyeDistance; output_info.MouthLValueR /= output_info.BothEyeDistance; return(true); }