/// <summary> /// Finds rectangular regions in the given image that are likely to contain objects the cascade has been trained for and returns those regions as a sequence of rectangles. /// The function scans the image several times at different scales. Each time it considers overlapping regions in the image. /// It may also apply some heuristics to reduce number of analyzed regions, such as Canny prunning. /// After it has proceeded and collected the candidate rectangles (regions that passed the classifier cascade), it groups them and returns a sequence of average rectangles for each large enough group. /// </summary> /// <param name="image">The image where the objects are to be detected from</param> /// <param name="scaleFactor">The factor by which the search window is scaled between the subsequent scans, for example, 1.1 means increasing window by 10%</param> /// <param name="minNeighbors">Minimum number (minus 1) of neighbor rectangles that makes up an object. All the groups of a smaller number of rectangles than min_neighbors-1 are rejected. If min_neighbors is 0, the function does not any grouping at all and returns all the detected candidate rectangles, which may be useful if the user wants to apply a customized grouping procedure. Use 3 for default.</param> /// <param name="minSize">Minimum window size. Use Size.Empty for default, where it is set to the size of samples the classifier has been trained on (~20x20 for face detection)</param> /// <param name="maxSize">Maximum window size. Use Size.Empty for default, where the parameter will be ignored.</param> /// <returns>The objects detected, one array per channel</returns> public Rectangle[] DetectMultiScale(IInputArray image, double scaleFactor = 1.1, int minNeighbors = 3, Size minSize = new Size(), Size maxSize = new Size()) { using (Util.VectorOfRect rectangles = new Util.VectorOfRect()) using (InputArray iaImage = image.GetInputArray()) { CvCascadeClassifierDetectMultiScale(_ptr, iaImage, rectangles, scaleFactor, minNeighbors, 0, ref minSize, ref maxSize); return rectangles.ToArray(); } }
/// <summary> /// Perform detection on the image /// </summary> /// <param name="mat">The image for detection.</param> /// <returns>The detection result</returns> public ObjectDetection[] Detect(Mat mat) { using (Util.VectorOfRect rects = new Util.VectorOfRect()) using (Util.VectorOfFloat scores = new Util.VectorOfFloat()) using (Util.VectorOfInt classIds = new Util.VectorOfInt()) { DpmInvoke.cveDPMDetectorDetect(_ptr, mat, rects, scores, classIds); ObjectDetection[] detections = new ObjectDetection[rects.Size]; for (var i = 0; i < detections.Length; i++) { detections[i] = new ObjectDetection(rects[i], scores[i], classIds[i]); } return(detections); } }