/// <summary> /// Groups the object candidate rectangles. /// </summary> /// <param name="rectList"> Input/output vector of rectangles. Output vector includes retained and grouped rectangles.</param> /// <param name="weights"></param> /// <param name="groupThreshold">Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it.</param> /// <param name="eps">Relative difference between sides of the rectangles to merge them into a group.</param> public static void GroupRectangles(IList <Rect> rectList, out int[] weights, int groupThreshold, double eps = 0.2) { if (rectList == null) { throw new ArgumentNullException(nameof(rectList)); } using (var rectListVec = new VectorOfRect(rectList)) using (var weightsVec = new VectorOfInt32()) { NativeMethods.objdetect_groupRectangles2(rectListVec.CvPtr, weightsVec.CvPtr, groupThreshold, eps); ClearAndAddRange(rectList, rectListVec.ToArray()); weights = weightsVec.ToArray(); } }
/// <summary> /// select the 512 "best description pairs" /// </summary> /// <param name="images">grayscale images set</param> /// <param name="keypoints">set of detected keypoints</param> /// <param name="corrThresh">correlation threshold</param> /// <param name="verbose">print construction information</param> /// <returns>list of best pair indexes</returns> public int[] SelectPairs(IEnumerable <Mat> images, out KeyPoint[][] keypoints, double corrThresh = 0.7, bool verbose = true) { if (images == null) { throw new ArgumentNullException(nameof(images)); } IntPtr[] imagesPtrs = EnumerableEx.SelectPtrs(images); using (var outVec = new VectorOfInt32()) using (var keypointsVec = new VectorOfVectorKeyPoint()) { NativeMethods.features2d_FREAK_selectPairs(ptr, imagesPtrs, imagesPtrs.Length, keypointsVec.CvPtr, corrThresh, verbose ? 1 : 0, outVec.CvPtr); keypoints = keypointsVec.ToArray(); return(outVec.ToArray()); } }
/// <summary> /// Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles. /// </summary> /// <param name="image">Matrix of the type CV_8U containing an image where objects are detected.</param> /// <param name="rejectLevels"></param> /// <param name="levelWeights"></param> /// <param name="scaleFactor">Parameter specifying how much the image size is reduced at each image scale.</param> /// <param name="minNeighbors">Parameter specifying how many neighbors each candidate rectangle should have to retain it.</param> /// <param name="flags">Parameter with the same meaning for an old cascade as in the function cvHaarDetectObjects. /// It is not used for a new cascade.</param> /// <param name="minSize">Minimum possible object size. Objects smaller than that are ignored.</param> /// <param name="maxSize">Maximum possible object size. Objects larger than that are ignored.</param> /// <param name="outputRejectLevels"></param> /// <returns>Vector of rectangles where each rectangle contains the detected object.</returns> public virtual Rect[] DetectMultiScale( Mat image, out int[] rejectLevels, out double[] levelWeights, double scaleFactor = 1.1, int minNeighbors = 3, HaarDetectionType flags = HaarDetectionType.Zero, Size?minSize = null, Size?maxSize = null, bool outputRejectLevels = false) { if (disposed) { throw new ObjectDisposedException("CascadeClassifier"); } if (image == null) { throw new ArgumentNullException(nameof(image)); } image.ThrowIfDisposed(); Size minSize0 = minSize.GetValueOrDefault(new Size()); Size maxSize0 = maxSize.GetValueOrDefault(new Size()); using (var objectsVec = new VectorOfRect()) using (var rejectLevelsVec = new VectorOfInt32()) using (var levelWeightsVec = new VectorOfDouble()) { NativeMethods.objdetect_CascadeClassifier_detectMultiScale( ptr, image.CvPtr, objectsVec.CvPtr, rejectLevelsVec.CvPtr, levelWeightsVec.CvPtr, scaleFactor, minNeighbors, (int)flags, minSize0, maxSize0, outputRejectLevels ? 1 : 0); rejectLevels = rejectLevelsVec.ToArray(); levelWeights = levelWeightsVec.ToArray(); return(objectsVec.ToArray()); } }