private void Window_Closed(object sender, EventArgs e) { _isloaded = false; winMagnifier.Close(); winMagnifier = null; if (winSelectFace != null) { winSelectFace.Close(); winSelectFace = null; } }
private void Window_Loaded(object sender, RoutedEventArgs e) { if (((MainWindow)this.Owner).DegPreRotate != 0) { chkRotate.IsChecked = true; } _isloaded = true; System.Diagnostics.Debug.Print("WinLoad"); Vector offset = VisualTreeHelper.GetOffset(((MainWindow)this.Owner).MainGrid); this.Top = ((MainWindow)this.Owner).Top + offset.Y + SystemParameters.WindowCaptionHeight; this.Left = ((MainWindow)this.Owner).Left + offset.X; _wbitmap = new WriteableBitmap(_mag_size, _mag_size, 96, 96, PixelFormats.Bgra32, null); winMagnifier = new Window3(); winMagnifier.Image1.Source = _wbitmap; UpdateMagnifier(0, 0); winMagnifier.Owner = this; winMagnifier.Show(); winMagnifier.Top = this.Top + Canvas.GetTop(Grid1) + SystemParameters.WindowCaptionHeight + 10; winMagnifier.Left = this.Left + Canvas.GetLeft(Grid1) + 10; if (winSelectFace != null) { winSelectFace.Close(); winSelectFace = null; } Button1_Click(null, null); Magnifier = winMagnifier; }
//Loading of facial points markers private void Button1_Click(object sender, RoutedEventArgs e) { for (int i = Canvas1.Children.Count - 1; i >= 0; i--) { if (Canvas1.Children[i].GetType() == typeof(System.Windows.Shapes.Ellipse)) { Canvas1.Children.Remove(Canvas1.Children[i]); } } var fps = ((MainWindow)this.Owner).ImageFacePoints; double imagewidth = ((BitmapImage)(Image1.Source)).PixelWidth; double imageheight = ((BitmapImage)(Image1.Source)).PixelHeight; this.UpdateLayout(); double wpfimagewidth = Image1.ActualWidth; double wpfimageheight = Image1.ActualHeight; double ratio = imageheight / wpfimageheight; for (int i = 0; i < _numfacepoints; i++) { System.Windows.Shapes.Ellipse ep = new System.Windows.Shapes.Ellipse(); ep.Name = "EP" + i; ep.Width = 30; ep.Height = 30; ep.StrokeThickness = 2; ep.Stroke = System.Windows.Media.Brushes.Red; ep.Fill = new SolidColorBrush(Color.FromArgb(10, 255, 255, 255)); ep.HorizontalAlignment = HorizontalAlignment.Left; ep.VerticalAlignment = VerticalAlignment.Top; ep.Uid = ep.Name; Canvas1.Children.Add(ep); Canvas.SetTop(ep, Canvas.GetTop(Grid1) + i * ep.Height + Image1.ActualHeight / 2); Canvas.SetLeft(ep, Canvas.GetLeft(Grid1) + 50);//(Image1.ActualWidth + ep.Width) / 2); ep.Focusable = true; ep.MouseDown += ep_MouseDown; ep.MouseMove += ep_MouseMove; ep.KeyDown += ep_KeyDown; } try { System.Drawing.Rectangle facerect = System.Drawing.Rectangle.Empty; System.Drawing.Rectangle[] eyesrect = null; string strfaceindex = ""; bool bFromCacheRects = false; if (sender != null && sender.GetType() == winSelectFace.GetType()) //Load face from cache { bFromCacheRects = true; } else { strfaceindex = CCommon.FindFaceAndEyes(Image1.Source.Clone() as BitmapImage, out facerect, out eyesrect); } //for implementation of multiple faces image //c is for cache if (strfaceindex == "c" || bFromCacheRects) { if (strfaceindex == "c") { if (winSelectFace != null) { winSelectFace = null; } // if (winSelectFace == null) winSelectFace = new Window4(); winSelectFace.Title = "Double click to select a face"; winSelectFace.Image1.Source = Image1.Source.Clone(); winSelectFace.FaceRects = CCommon.cacheRects.ToArray(); winSelectFace.Owner = this; winSelectFace.Show(); } try { //wait for face to be selected while (!winSelectFace.IsFaceSelected) { System.Windows.Forms.Application.DoEvents(); } } catch //fires if winSelectFace is closed without making a selection { return; } //get the index of the face from winSelectFace strfaceindex = "" + winSelectFace.FaceSelectedIndex; facerect = CCommon.cacheRects.ElementAt(winSelectFace.FaceSelectedIndex); CCommon.FindEyesFromCache(winSelectFace.FaceSelectedIndex, out eyesrect); } else //for single face image, we close winSelectFace { if (winSelectFace != null) { winSelectFace.Close(); winSelectFace = null; } } //store the index of face selected //note that for single face image, this is "" FaceIndexString = strfaceindex; ///////////////////////// //Crop Image1.Source based on facerect if (facerect != System.Drawing.Rectangle.Empty) { //Rescaling if (bFromCacheRects) { //load default unscaled Image1.Source = CCommon.Bitmap2BitmapImage(CCommon.cacheBm); } //scale and reload if image is too large if (facerect.Height > 500) { double rescale = 500.0 / facerect.Height; int newsize = ((BitmapImage)Image1.Source).PixelWidth > ((BitmapImage)Image1.Source).PixelHeight ? (int)(rescale * ((BitmapImage)Image1.Source).PixelWidth) : (int)(rescale * ((BitmapImage)Image1.Source).PixelHeight); CCommon.LoadImageSource(Image1, CurrentFile, true, newsize); //rescale face facerect = new System.Drawing.Rectangle((int)(facerect.X * rescale), (int)(facerect.Y * rescale), (int)(facerect.Width * rescale), (int)(facerect.Height * rescale)); //rescale all the eyepoints for (int i = 0; i < eyesrect.Length; i++) { eyesrect[i] = new System.Drawing.Rectangle((int)(eyesrect[i].X * rescale), (int)(eyesrect[i].Y * rescale), (int)(eyesrect[i].Width * rescale), (int)(eyesrect[i].Height * rescale)); } } int newtop = (int)(facerect.Top) - (int)(0.3 * facerect.Height); if (newtop < 0) { newtop = 0; } int deltatop = facerect.Top - newtop; int newleft = (int)(facerect.Left) - (int)(0.3 * facerect.Width); if (newleft < 0) { newleft = 0; } int deltaleft = facerect.Left - newleft; int maxheight = ((BitmapImage)Image1.Source).PixelHeight - newtop - 1; facerect.Height = (int)(facerect.Height * 1.6); if (facerect.Height > maxheight) { facerect.Height = maxheight; } int maxwidth = ((BitmapImage)Image1.Source).PixelWidth - newleft - 1; facerect.Width = (int)(facerect.Width * 1.6); if (facerect.Width > maxwidth) { facerect.Width = maxwidth; } facerect = new System.Drawing.Rectangle(newleft, newtop, facerect.Width, facerect.Height); CroppedBitmap crop = new CroppedBitmap( Image1.Source.Clone() as BitmapImage, new Int32Rect(facerect.Left, facerect.Top, facerect.Width, facerect.Height) ); System.Drawing.Bitmap bm = CCommon.BitmapImage2Bitmap(crop); bm.Save(AppDomain.CurrentDomain.BaseDirectory + "temp\\~cropface.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bm.Dispose(); bm = null; CCommon.LoadImageSource(Image1, AppDomain.CurrentDomain.BaseDirectory + "temp\\~cropface.jpg", false); imagewidth = ((BitmapImage)(Image1.Source)).PixelWidth; imageheight = ((BitmapImage)(Image1.Source)).PixelHeight; this.UpdateLayout(); wpfimagewidth = Image1.ActualWidth; wpfimageheight = Image1.ActualHeight; //find the new ratio ratio = imageheight / wpfimageheight; facerect = new System.Drawing.Rectangle(deltaleft, deltatop, facerect.Width, facerect.Height); } ////////////////// //strfaceindex!="" implies face is from a multiple faces image if (strfaceindex != "") { var fileparts = this.CurrentFile.Split('\\'); string facepointsfile = AppDomain.CurrentDomain.BaseDirectory + "temp\\" + fileparts[fileparts.Length - 1] + strfaceindex + ".info.txt"; //check if we have the cached face points in file if (File.Exists(facepointsfile)) { //read these face points and update the face points markers using (var file = File.OpenText(facepointsfile)) { List <FeaturePointType> facepoints = new List <FeaturePointType>(); string s = file.ReadToEnd(); var lines = s.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < lines.Length; i++) { var parts = lines[i].Split('='); FeaturePointType fp = new FeaturePointType(); fp.desp = parts[0]; fp.pt = ExtractPoint(parts[1]); facepoints.Add(fp); } ((MainWindow)this.Owner).ImageFacePoints = facepoints; } LoadFacePointsFromCache = true; fps = ((MainWindow)this.Owner).ImageFacePoints; } else { LoadFacePointsFromCache = false; } } //////////////// if (facerect != System.Drawing.Rectangle.Empty && LoadFacePointsFromCache) { List <UIElement> list = Canvas1.Children.Cast <UIElement>().ToList(); for (int i = 0; i < _numfacepoints; i++) { System.Windows.Shapes.Ellipse ep = (System.Windows.Shapes.Ellipse)list.Single(s => s.Uid == "EP" + i); Canvas.SetTop(ep, fps[i].pt.Y / ratio + Canvas.GetTop(Grid1) - ep.Height / 2); Canvas.SetLeft(ep, fps[i].pt.X / ratio + Canvas.GetLeft(Grid1) - ep.Width / 2); } } if (facerect != System.Drawing.Rectangle.Empty && eyesrect != null && !LoadFacePointsFromCache) { List <UIElement> list = Canvas1.Children.Cast <UIElement>().ToList(); //For elimination of overlapping eyes detected System.Drawing.Bitmap bmtemp = new System.Drawing.Bitmap((int)imagewidth, (int)imageheight /*,System.Drawing.Imaging.PixelFormat.Format24bppRgb*/); System.Drawing.Graphics gbmptemp = System.Drawing.Graphics.FromImage(bmtemp); gbmptemp.Clear(System.Drawing.Color.Black); int nmaxeyes = (eyesrect.Length > _numfacepoints) ? _numfacepoints : eyesrect.Length; int n = 0; for (int i = 0; i < nmaxeyes; i++) { //valid eye pos relative to facerect top //var normalized_eye_y = ((double)eyesrect[i].Y +((double)eyesrect[i].Height/2)) / facerect.Height; //var normalized_eye_x_to_mid_face = // Math.Abs((eyesrect[i].X + (double)eyesrect[i].Width / 2) - ((double)facerect.Width / 2)) / ((double)facerect.Width / 2); //System.Diagnostics.Debug.Print("{0} {1}", normalized_eye_y,normalized_eye_x_to_mid_face); System.Windows.Shapes.Ellipse ep = (System.Windows.Shapes.Ellipse)list.Single(s => s.Uid == "EP" + i); double top = (eyesrect[i].Y + facerect.Y + (double)eyesrect[i].Height / 2) / ratio + Canvas.GetTop(Grid1) - ep.Height / 2; double left = (eyesrect[i].X + facerect.X + (double)eyesrect[i].Width / 2) / ratio + Canvas.GetLeft(Grid1) - ep.Width / 2; int argb = (bmtemp.GetPixel(facerect.X + eyesrect[i].X, facerect.Y + eyesrect[i].Y)).ToArgb(); if (argb == System.Drawing.Color.Black.ToArgb()) { if (n >= 2) { break; //we already got 2 eyes, dont need any more } Canvas.SetTop(ep, top); Canvas.SetLeft(ep, left); _currentEllipseIndex = (++n) % _numfacepoints; } gbmptemp.FillEllipse(System.Drawing.Brushes.White, facerect.X + eyesrect[i].X, facerect.Y + eyesrect[i].Y, eyesrect[i].Width, eyesrect[i].Height); System.Diagnostics.Debug.Print("Get {0},{1}", Canvas.GetLeft(ep), Canvas.GetTop(ep)); } bmtemp.Save(AppDomain.CurrentDomain.BaseDirectory + "temp\\~eploc.bmp", System.Drawing.Imaging.ImageFormat.Bmp); gbmptemp.Dispose(); bmtemp.Dispose(); bmtemp = null; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }