/// <summary> /// Raises the scan face mask button click event. /// </summary> public void OnScanFaceMaskButtonClick() { RemoveFaceMask(); // Capture webcam frame. if (webCamTextureToMatHelper.IsPlaying()) { Mat rgbaMat = webCamTextureToMatHelper.GetMat(); faceRectInMask = DetectFace(rgbaMat); if (faceRectInMask.width == 0 && faceRectInMask.height == 0) { Debug.Log("A face could not be detected from the input image."); return; } OpenCVForUnity.Rect rect = new OpenCVForUnity.Rect((int)faceRectInMask.x, (int)faceRectInMask.y, (int)faceRectInMask.width, (int)faceRectInMask.height); rect.inflate(rect.x / 5, rect.y / 5); rect = rect.intersect(new OpenCVForUnity.Rect(0, 0, rgbaMat.width(), rgbaMat.height())); faceMaskTexture = new Texture2D(rect.width, rect.height, TextureFormat.RGBA32, false); faceMaskMat = new Mat(rgbaMat, rect).clone(); OpenCVForUnity.Utils.matToTexture2D(faceMaskMat, faceMaskTexture); Debug.Log("faceMaskMat ToString " + faceMaskMat.ToString()); faceRectInMask = DetectFace(faceMaskMat); faceLandmarkPointsInMask = DetectFaceLandmarkPoints(faceMaskMat, faceRectInMask); if (faceRectInMask.width == 0 && faceRectInMask.height == 0) { RemoveFaceMask(); Debug.Log("A face could not be detected from the input image."); } } }
private void DetectInRegion(Mat img, Rect r, List <Rect> detectedObjectsInRegions) { Rect r0 = new Rect(new Point(), img.size()); Rect r1 = new Rect(r.x, r.y, r.width, r.height); Rect.inflate(r1, (int)((r1.width * innerParameters.coeffTrackingWindowSize) - r1.width) / 2, (int)((r1.height * innerParameters.coeffTrackingWindowSize) - r1.height) / 2); r1 = Rect.intersect(r0, r1); if (r1 != null && (r1.width <= 0) || (r1.height <= 0)) { Debug.Log("DetectionBasedTracker::detectInRegion: Empty intersection"); return; } int d = Math.Min(r.width, r.height); d = (int)Math.Round(d * innerParameters.coeffObjectSizeToTrack); MatOfRect tmpobjects = new MatOfRect(); Mat img1 = new Mat(img, r1); //subimage for rectangle -- without data copying cascade.detectMultiScale(img1, tmpobjects, 1.1, 2, 0 | Objdetect.CASCADE_DO_CANNY_PRUNING | Objdetect.CASCADE_SCALE_IMAGE | Objdetect.CASCADE_FIND_BIGGEST_OBJECT, new Size(d, d), new Size()); Rect[] tmpobjectsArray = tmpobjects.toArray(); int len = tmpobjectsArray.Length; for (int i = 0; i < len; i++) { Rect tmp = tmpobjectsArray [i]; Rect curres = new Rect(new Point(tmp.x + r1.x, tmp.y + r1.y), tmp.size()); detectedObjectsInRegions.Add(curres); } }