Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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);
        }