public static void DrawFaceRegion(Image <Bgr, Byte> image, FaceRegion2D faceRegion, Bgr color) { image.Draw(faceRegion.Face.ToRectangle(), color, 2); if (faceRegion.LeftEye != null) { image.Draw(new Rectangle (faceRegion.Face.Location.X + faceRegion.LeftEye.Location.X, faceRegion.Face.Location.Y + faceRegion.LeftEye.Location.Y, faceRegion.LeftEye.Width, faceRegion.LeftEye.Height), color, 2); } if (faceRegion.RightEye != null) { image.Draw(new Rectangle (faceRegion.Face.Location.X + faceRegion.RightEye.Location.X, faceRegion.Face.Location.Y + faceRegion.RightEye.Location.Y, faceRegion.RightEye.Width, faceRegion.RightEye.Height), color, 2); } if (faceRegion.Mouth != null) { image.Draw(new Rectangle (faceRegion.Face.Location.X + faceRegion.Mouth.Location.X, faceRegion.Face.Location.Y + faceRegion.Mouth.Location.Y, faceRegion.Mouth.Width, faceRegion.Mouth.Height), color, 2); } }
public FaceRegion2DHistory(FaceRegion2D faceRegion) { Face = faceRegion.Face; LeftEye = faceRegion.LeftEye; RightEye = faceRegion.RightEye; Mouth = faceRegion.Mouth; EyeAngle = faceRegion.EyeAngle; }
public static void DrawFaceRegionCircle(Image <Bgr, Byte> image, FaceRegion2D faceRegion, Bgr color) { image.Draw(new CircleF(new PointF(faceRegion.Face.Location.X + faceRegion.Face.Width / 2, faceRegion.Face.Location.Y + faceRegion.Face.Height / 2), (faceRegion.Face.Width + faceRegion.Face.Height) / 4), color, 2); if (faceRegion.LeftEye != null) { image.Draw(new CircleF(new PointF (faceRegion.Face.Location.X + faceRegion.LeftEye.Location.X + faceRegion.LeftEye.Width / 2, faceRegion.Face.Location.Y + faceRegion.LeftEye.Location.Y + faceRegion.LeftEye.Height / 2), (faceRegion.LeftEye.Width + faceRegion.LeftEye.Height) / 4), color, 2); } if (faceRegion.RightEye != null) { image.Draw(new CircleF(new PointF (faceRegion.Face.Location.X + faceRegion.RightEye.Location.X + faceRegion.RightEye.Width / 2, faceRegion.Face.Location.Y + faceRegion.RightEye.Location.Y + faceRegion.RightEye.Height / 2), (faceRegion.RightEye.Width + faceRegion.RightEye.Height) / 4), color, 2); } }
private void ProcessFrame() { while (_captureContinue) { while (_processQueueLength != 2) { Thread.Sleep(SleepInterval); } if ((Helper2D.FilterInstances.Mode == Mode.Cpu && useGpuMenuItem.Checked) || (Helper2D.FilterInstances.Mode == Mode.Gpu && useGpuMenuItem.Checked == false)) { Helper2D.FilterInstances = new FilterInstances(useGpuMenuItem.Checked ? Mode.Gpu : Mode.Cpu); } double distance; if (_cameras[0].FaceRegions == null || _cameras[1].FaceRegions == null) { _resetCorrelation = true; } if (_resetCorrelation == false) { #region Find correlation with previous face regions // iterate through all cameras and track faces foreach (Camera camera in _cameras) { var newRawFaceRegions = new List <FaceRegion2D>(); // iterate through every face found previously, rotate image and find faces foreach (FaceRegion2D faceRegion in camera.FaceRegions) { Image <Bgr, byte> image = camera.Image.Rotate(faceRegion.EyeAngle, new PointF(faceRegion.Face.Location.X + faceRegion.Face.Width / 2, faceRegion.Face.Location.Y + faceRegion.Face.Height / 2), INTER.CV_INTER_CUBIC, _rotateBackground, true); if (_debugRotation) { camera.Image = image; } // find faces in rotated image newRawFaceRegions.AddRange(Helper2D.GetFaceRegion2Ds(image, FaceWidth, FaceHeight, true, false)); } // find best corespondence between old faces and new faces IEnumerable <Tuple <int, int> > corespondences = Helper.FindCorespondence (camera.FaceRegions.Select(item => item.Face.Location).ToArray(), newRawFaceRegions.Select(item => item.Face.Location).ToArray(), out distance); if (corespondences == null || corespondences.Any() == false) { // face regions lost .. RESET both cameras _resetCorrelation = true; break; } var newFaceRegions = new FaceRegion2D[corespondences.Count()]; for (int i = 0; i < corespondences.Count(); i++) { FaceRegion2D faceRegion = newRawFaceRegions.ElementAt(corespondences.ElementAt(i).Item2); faceRegion.SetHistory(camera.FaceRegions.ElementAt(corespondences.ElementAt(i).Item1)); newFaceRegions[i] = faceRegion; } camera.FaceRegions = newFaceRegions; } #endregion } if (_resetCorrelation) { #region Reset Found Faces foreach (Camera camera in _cameras) { camera.FaceRegions = Helper2D.GetFaceRegion2Ds(camera.Image, FaceWidth, FaceHeight, true, false); } #endregion } if (_cameras[0].FaceRegions.Length > 0 && _cameras[1].FaceRegions.Length > 0) { #region Find correlation in stereo images and add history IEnumerable <Point>[] points = _cameras.Select(camera => camera.FaceRegions. Select(region => region.Face.Location)).ToArray(); List <Tuple <int, int> > correlations = Helper.FindCorespondence(points.ElementAt(0), points.ElementAt(1), out distance).ToList(); // images have incorect correlations and history if (_resetCorrelation == false && correlations.Any(item => _cameras[0].FaceRegions.ElementAt(item.Item1).Id != _cameras[1].FaceRegions.ElementAt(item.Item2).Id)) { _resetCorrelation = true; } if (_resetCorrelation) { // assign faces color and Id foreach (var correlation in correlations) { var color = new Bgr(_random.NextDouble() * 255, _random.NextDouble() * 255, _random.NextDouble() * 255); FaceRegion2D leftFaceRegion = _cameras[0].FaceRegions.ElementAt(correlation.Item1); FaceRegion2D rightFaceRegion = _cameras[1].FaceRegions.ElementAt(correlation.Item2); rightFaceRegion.Id = leftFaceRegion.Id; leftFaceRegion.BoundingBoxColor = color; rightFaceRegion.BoundingBoxColor = color; } } #endregion #region Recognize Faces _cameras.ForEach(camera => { if (camera.FaceRegions != null) { camera.FaceRegions.ToList().ForEach(faceRegion => { Helper.DrawFaceRegionCircle(camera.Image, faceRegion, faceRegion.BoundingBoxColor); string label = HelperFaces.Recognize(faceRegion.FaceImage); camera.Image.Draw(string.Format("{0}", label), ref _font, faceRegion.Face.Location, new Bgr(0, 0, 255)); }); } }); #endregion EventHandler <FaceRegionsEventArgs> facesAvailableHandler = FacesAvailable; if (facesAvailableHandler != null) { facesAvailableHandler(this, new FaceRegionsEventArgs(_cameras[0].FaceRegions, _cameras[1].FaceRegions, null)); } _faces = _cameras.SelectMany(camera => camera.FaceRegions).Select(item => item.FaceImage).ToArray(); } _resetCorrelation = false; PostProcess(); lock (this) { _processQueueLength = 0; } } }
private void OnButtonCalibrateClick(object sender, EventArgs e) { if (_leftFaceRegions.Count < 3) { return; } IsCalibrating = true; try { var objectPoints = new MCvPoint3D32f[_leftFaceRegions.Count][]; FaceRegion2D firstLeft = _leftFaceRegions.First(); for (int i = 0; i < _leftFaceRegions.Count; i++) { objectPoints[i] = new MCvPoint3D32f[4]; objectPoints[i][0] = new MCvPoint3D32f(firstLeft.Mouth.Location.X, firstLeft.Mouth.Location.Y, 0); objectPoints[i][1] = new MCvPoint3D32f(firstLeft.LeftEye.Location.X, firstLeft.LeftEye.Location.Y, 0); objectPoints[i][2] = new MCvPoint3D32f(firstLeft.RightEye.Location.X, firstLeft.RightEye.Location.Y, 0); objectPoints[i][3] = new MCvPoint3D32f(firstLeft.Face.Location.X, firstLeft.Face.Location.Y, 0); } var leftImagePoints = new PointF[_leftFaceRegions.Count][]; for (int i = 0; i < _leftFaceRegions.Count; i++) { leftImagePoints[i] = new PointF[4]; leftImagePoints[i][0] = new PointF(_leftFaceRegions[i].Mouth.Location.X, _leftFaceRegions[i].Mouth.Location.Y); leftImagePoints[i][1] = new PointF(_leftFaceRegions[i].LeftEye.Location.X, _leftFaceRegions[i].LeftEye.Location.Y); leftImagePoints[i][2] = new PointF(_leftFaceRegions[i].RightEye.Location.X, _leftFaceRegions[i].RightEye.Location.Y); leftImagePoints[i][3] = new PointF(_leftFaceRegions[i].Face.Location.X, _leftFaceRegions[i].Face.Location.Y); } var rightImagePoints = new PointF[_leftFaceRegions.Count][]; for (int i = 0; i < _leftFaceRegions.Count; i++) { rightImagePoints[i] = new PointF[4]; rightImagePoints[i][0] = new PointF(_rightFaceRegions[i].Mouth.Location.X, _rightFaceRegions[i].Mouth.Location.Y); rightImagePoints[i][1] = new PointF(_rightFaceRegions[i].LeftEye.Location.X, _rightFaceRegions[i].LeftEye.Location.Y); rightImagePoints[i][2] = new PointF(_rightFaceRegions[i].RightEye.Location.X, _rightFaceRegions[i].RightEye.Location.Y); rightImagePoints[i][3] = new PointF(_rightFaceRegions[i].Face.Location.X, _rightFaceRegions[i].Face.Location.Y); } var intrinsicCameraParameters1 = new IntrinsicCameraParameters(); var intrinsicCameraParameters2 = new IntrinsicCameraParameters(); ExtrinsicCameraParameters extrinsicCameraParameters; Matrix <double> foundamentalMatrix; Matrix <double> essentialMatrix; CameraCalibration.StereoCalibrate(objectPoints, leftImagePoints, rightImagePoints, intrinsicCameraParameters1, intrinsicCameraParameters2, new Size(firstLeft.SourceImage.Width, firstLeft.SourceImage.Height), CALIB_TYPE.DEFAULT, new MCvTermCriteria(), out extrinsicCameraParameters, out foundamentalMatrix, out essentialMatrix); Options.StereoCalibrationOptions = new StereoCalibrationOptions { EssentialMatrix = essentialMatrix, ExtrinsicCameraParameters = extrinsicCameraParameters, FoundamentalMatrix = foundamentalMatrix }; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { IsCalibrating = false; } }