private void DetectInRegion(Mat img, Rect region, List <Rect> detectedObjectsInRegions, CascadeClassifier cascade) { Rect r0 = new Rect(new Point(), img.size()); Rect r1 = new Rect(region.x, region.y, region.width, region.height); Rect.inflate(r1, (int)((r1.width * coeffTrackingWindowSize) - r1.width) / 2, (int)((r1.height * coeffTrackingWindowSize) - r1.height) / 2); r1 = Rect.intersect(r0, r1); if ((r1.width <= 0) || (r1.height <= 0)) { Debug.Log("detectInRegion: Empty intersection"); return; } int d = Math.Min(region.width, region.height); d = (int)Math.Round(d * coeffObjectSizeToTrack); using (MatOfRect tmpobjects = new MatOfRect()) using (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 r = new Rect(new Point(tmp.x + r1.x, tmp.y + r1.y), tmp.size()); detectedObjectsInRegions.Add(r); } } }
private void DetectInRegion(Mat img, Rect region, List <Rect> detectedObjectsInRegions, FaceLandmarkDetector landmarkDetector) { Rect r0 = new Rect(new Point(), img.size()); Rect r1 = new Rect(region.x, region.y, region.width, region.height); Rect.inflate(r1, (int)((r1.width * coeffTrackingWindowSize) - r1.width) / 2, (int)((r1.height * coeffTrackingWindowSize) - r1.height) / 2); r1 = Rect.intersect(r0, r1); if ((r1.width <= 0) || (r1.height <= 0)) { Debug.Log("detectInRegion: Empty intersection"); return; } using (Mat img1_roi = new Mat(img, r1)) using (Mat img1 = new Mat(r1.size(), img.type())) { img1_roi.copyTo(img1); OpenCVForUnityUtils.SetImage(landmarkDetector, img1); List <UnityEngine.Rect> detectResult = landmarkDetector.Detect(); int len = detectResult.Count; for (int i = 0; i < len; i++) { UnityEngine.Rect tmp = detectResult[i]; Rect r = new Rect((int)(tmp.x + r1.x), (int)(tmp.y + r1.y), (int)tmp.width, (int)tmp.height); detectedObjectsInRegions.Add(r); } } }
/// <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; } Rect rect = new 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 Rect(0, 0, rgbaMat.width(), rgbaMat.height())); faceMaskTexture = new Texture2D(rect.width, rect.height, TextureFormat.RGBA32, false); faceMaskMat = new Mat(rgbaMat, rect).clone(); OpenCVForUnity.UnityUtils.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."); } } }
void DoProcess() { if (!(owner.Value is OpenCVForUnityPlayMakerActions.Rect)) { LogError("owner is not initialized. Add Action \"newRect\"."); return; } OpenCVForUnity.CoreModule.Rect wrapped_owner = OpenCVForUnityPlayMakerActionsUtils.GetWrappedObject <OpenCVForUnityPlayMakerActions.Rect, OpenCVForUnity.CoreModule.Rect>(owner); wrapped_owner.inflate(new OpenCVForUnity.CoreModule.Size((double)size_width.Value, (double)size_height.Value)); }
void DoProcess() { if (!(owner.Value is OpenCVForUnityPlayMakerActions.Rect)) { LogError("owner is not initialized. Add Action \"newRect\"."); return; } OpenCVForUnity.CoreModule.Rect wrapped_owner = OpenCVForUnityPlayMakerActionsUtils.GetWrappedObject <OpenCVForUnityPlayMakerActions.Rect, OpenCVForUnity.CoreModule.Rect>(owner); if (!(size.Value is OpenCVForUnityPlayMakerActions.Size)) { LogError("size is not initialized. Add Action \"newSize\"."); return; } OpenCVForUnity.CoreModule.Size wrapped_size = OpenCVForUnityPlayMakerActionsUtils.GetWrappedObject <OpenCVForUnityPlayMakerActions.Size, OpenCVForUnity.CoreModule.Size>(size); wrapped_owner.inflate(wrapped_size); }