/// <summary> /// Compute the descriptors for a keypoints collection detected in image collection. /// </summary> /// <param name="images">Image collection.</param> /// <param name="keypoints">Input keypoints collection. keypoints[i] is keypoints detected in images[i]. /// Keypoints for which a descriptor cannot be computed are removed.</param> /// <param name="descriptors">Descriptor collection. descriptors[i] are descriptors computed for set keypoints[i].</param> public virtual void Compute(IEnumerable <Mat> images, ref KeyPoint[][] keypoints, IEnumerable <Mat> descriptors) { ThrowIfDisposed(); if (images == null) { throw new ArgumentNullException(nameof(images)); } if (descriptors == null) { throw new ArgumentNullException(nameof(descriptors)); } IntPtr[] imagesPtrs = EnumerableEx.SelectPtrs(images); IntPtr[] descriptorsPtrs = EnumerableEx.SelectPtrs(descriptors); using (var keypointsVec = new VectorOfVectorKeyPoint(keypoints)) { NativeMethods.features2d_Feature2D_compute2( ptr, imagesPtrs, imagesPtrs.Length, keypointsVec.CvPtr, descriptorsPtrs, descriptorsPtrs.Length); keypoints = keypointsVec.ToArray(); } GC.KeepAlive(this); GC.KeepAlive(images); GC.KeepAlive(descriptors); }
/// <summary> /// Compute the descriptors for a keypoints collection detected in image collection. /// </summary> /// <param name="images">Image collection.</param> /// <param name="keypoints">Input keypoints collection. keypoints[i] is keypoints detected in images[i]. /// Keypoints for which a descriptor cannot be computed are removed.</param> /// <param name="descriptors">Descriptor collection. descriptors[i] are descriptors computed for set keypoints[i].</param> public virtual void Compute(IEnumerable <Mat> images, ref KeyPoint[][] keypoints, IEnumerable <Mat> descriptors) { if (disposed) { throw new ObjectDisposedException(GetType().Name); } if (images == null) { throw new ArgumentNullException("images"); } if (descriptors == null) { throw new ArgumentNullException("descriptors"); } IntPtr[] imagesPtrs = EnumerableEx.SelectPtrs(images); IntPtr[] descriptorsPtrs = EnumerableEx.SelectPtrs(descriptors); using (var keypointsVec = new VectorOfVectorKeyPoint(keypoints)) { NativeMethods.features2d_Feature2D_compute2( ptr, imagesPtrs, imagesPtrs.Length, keypointsVec.CvPtr, descriptorsPtrs, descriptorsPtrs.Length); keypoints = keypointsVec.ToArray(); } }
/// <summary> /// Detect keypoints in an image set. /// </summary> /// <param name="images">Image collection.</param> /// <param name="masks">Masks for image set. masks[i] is a mask for images[i].</param> /// <returns>Collection of keypoints detected in an input images. keypoints[i] is a set of keypoints detected in an images[i].</returns> public KeyPoint[][] Detect(IEnumerable <Mat> images, IEnumerable <Mat> masks = null) { if (images == null) { throw new ArgumentNullException(nameof(images)); } ThrowIfDisposed(); Mat[] imagesArray = EnumerableEx.ToArray(images); IntPtr[] imagesPtr = new IntPtr[imagesArray.Length]; for (int i = 0; i < imagesArray.Length; i++) { imagesPtr[i] = imagesArray[i].CvPtr; } using (var keypoints = new VectorOfVectorKeyPoint()) { if (masks == null) { NativeMethods.features2d_Feature2D_detect_Mat2( ptr, imagesPtr, imagesArray.Length, keypoints.CvPtr, null); } else { IntPtr[] masksPtr = EnumerableEx.SelectPtrs(masks); if (masksPtr.Length != imagesArray.Length) { throw new ArgumentException("masks.Length != images.Length"); } NativeMethods.features2d_Feature2D_detect_Mat2( ptr, imagesPtr, imagesArray.Length, keypoints.CvPtr, masksPtr); } return(keypoints.ToArray()); } }
/// <summary> /// Detect keypoints in an image set. /// </summary> /// <param name="images">Image collection.</param> /// <param name="masks">Masks for image set. masks[i] is a mask for images[i].</param> /// <returns>Collection of keypoints detected in an input images. keypoints[i] is a set of keypoints detected in an images[i].</returns> public KeyPoint[][] Detect(IEnumerable <Mat> images, IEnumerable <Mat>?masks = null) { if (images == null) { throw new ArgumentNullException(nameof(images)); } ThrowIfDisposed(); var imagesArray = images.ToArray(); var imagesPtr = new IntPtr[imagesArray.Length]; for (var i = 0; i < imagesArray.Length; i++) { imagesPtr[i] = imagesArray[i].CvPtr; } using var keypoints = new VectorOfVectorKeyPoint(); IntPtr[]? masksPtr = null; if (masks != null) { masksPtr = masks.Select(x => x.CvPtr).ToArray(); if (masksPtr.Length != imagesArray.Length) { throw new ArgumentException("masks.Length != images.Length"); } } NativeMethods.HandleException( NativeMethods.features2d_Feature2D_detect_Mat2( ptr, imagesPtr, imagesArray.Length, keypoints.CvPtr, masksPtr)); GC.KeepAlive(masks); GC.KeepAlive(this); GC.KeepAlive(imagesArray); return(keypoints.ToArray()); }