//画像ファイルロード private bool LoadImageFile(String file_name) { //カスケード分類器の特徴量を取得する CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile(@"C:\opencv2.4.10\sources\data\haarcascades\haarcascade_frontalface_alt.xml"); CvMemStorage strage = new CvMemStorage(0); // メモリを確保 this.ImageFileName = file_name; using (IplImage img = new IplImage(this.ImageFileName)) { //グレースケールに変換 using (IplImage gray_image = Cv.CreateImage(new CvSize(img.Width, img.Height), BitDepth.U8, 1)) { Cv.CvtColor(img, gray_image, ColorConversion.BgrToGray); //発見した矩形 var result = Cv.HaarDetectObjects(gray_image, cascade, strage); for (int i = 0; i < result.Total; i++) { //矩形の大きさに書き出す CvRect rect = result[i].Value.Rect; Cv.Rectangle(img, rect, new CvColor(255, 0, 0)); //iplimageをコピー img.ROI = rect; CvRect roi_rect = img.ROI; IplImage ipl_image = Cv.CreateImage(new CvSize(img.Width, img.Height), BitDepth.U8, 1); ipl_image = img.Clone(img.ROI); /* * //確認 * new CvWindow(ipl_image); * Cv.WaitKey(); */ //見つけた顔候補をすべてチェックするために記録する this.FaceIplList.Add(ipl_image); } } //メモリ解放 cascade.Dispose(); strage.Dispose(); return(true); } }
/// <summary> /// ファイル名から特徴量を出す処理 /// </summary> /// <param name="file_name"></param> public void MakeFeatureFromIpl(IplImage ipl_image, int face_id) { string eye_cascade_xml = @"C:\opencv2.4.10\sources\data\haarcascades\haarcascade_eye.xml"; string nose_cascade_xml = @"C:\opencv2.4.10\sources\data\haarcascades\haarcascade_mcs_nose.xml"; string mouth_cascade_xml = @"C:\opencv2.4.10\sources\data\haarcascades\haarcascade_mcs_mouth.xml"; CvMemStorage strage = new CvMemStorage(0); // メモリを確保 CvHaarClassifierCascade eye_cascade = CvHaarClassifierCascade.FromFile(eye_cascade_xml); CvHaarClassifierCascade nose_cascade = CvHaarClassifierCascade.FromFile(nose_cascade_xml); CvHaarClassifierCascade mouth_cascade = CvHaarClassifierCascade.FromFile(mouth_cascade_xml); //リストにあるファイルを一枚づつデータにする { IplImage tmp_image; //サイズが小さければ拡大して使う if (ipl_image.Size.Width < SMALL_IMAGE_LIMIT) { tmp_image = Cv.CreateImage(new CvSize(ipl_image.Width * IMAGE_RESIZE_RATE, ipl_image.Height * IMAGE_RESIZE_RATE), BitDepth.U8, 3); Cv.Resize(ipl_image, tmp_image); } else { tmp_image = Cv.CreateImage(new CvSize(ipl_image.Width, ipl_image.Height), BitDepth.U8, 3); Cv.Resize(ipl_image, tmp_image); } //グレースケールに変換 IplImage gray_image = Cv.CreateImage(new CvSize(tmp_image.Width, tmp_image.Height), BitDepth.U8, 1); Cv.CvtColor(tmp_image, gray_image, ColorConversion.BgrToGray); //発見した矩形 this.EyeResult = Cv.HaarDetectObjects(gray_image, eye_cascade, strage); //鼻は画像の真ん中の方だけ { IplImage gray_nose_image = Cv.CreateImage(new CvSize(tmp_image.Width, tmp_image.Height), BitDepth.U8, 1); Cv.CvtColor(tmp_image, gray_nose_image, ColorConversion.BgrToGray); CvRect rect = new CvRect(0, (int)(tmp_image.Height * 0.25), tmp_image.Width, tmp_image.Height / 2); gray_nose_image.ROI = rect; // new CvWindow(gray_nose_image); // Cv.WaitKey(); this.NoseResult = Cv.HaarDetectObjects(gray_nose_image, nose_cascade, strage); } //口は画像の下半分だけを調べる { IplImage gray_mouth_image = Cv.CreateImage(new CvSize(tmp_image.Width, tmp_image.Height), BitDepth.U8, 1); Cv.CvtColor(tmp_image, gray_mouth_image, ColorConversion.BgrToGray); CvRect rect = new CvRect(0, (int)(tmp_image.Height * 0.66), tmp_image.Width, tmp_image.Height / 3); gray_mouth_image.ROI = rect; // new CvWindow(gray_mouth_image); // Cv.WaitKey(); this.MouthResult = Cv.HaarDetectObjects(gray_mouth_image, mouth_cascade, strage); } //初期化 DataInit(); //デバッグ用の表示 // DebugPrint(tmp_image, this.ReadCount); //左眼、右目、鼻、口の矩形を確定させる。 DecidePartsRect(gray_image); //パーツ確定後 // DebugPrint2(gray_image, this.ReadCount); PartsRectInfo parts_info; parts_info.RightEye = this.RightEyeRect; parts_info.LeftEye = this.LeftEyeRect; parts_info.Nose = this.NoseRect; parts_info.Mouth = this.MouthRect; //特徴量を作る FeatureValue feature_value = new FeatureValue(); bool ret = MakeFeatureValue(gray_image, ref parts_info, out feature_value); //正しいデータを登録 if (ret) { feature_value.ID = face_id; this.FeatuerValueList.Add(feature_value); } } //メモリ解放 eye_cascade.Dispose(); nose_cascade.Dispose(); mouth_cascade.Dispose(); strage.Dispose(); return; }