/// <summary> /// Find best matches for each query descriptor which have distance less than /// maxDistance (in increasing order of distances). /// </summary> /// <param name="queryDescriptors"></param> /// <param name="maxDistance"></param> /// <param name="masks"></param> /// <param name="compactResult"></param> /// <returns></returns> public DMatch[][] RadiusMatch(Mat queryDescriptors, float maxDistance, Mat[] masks = null, bool compactResult = false) { ThrowIfDisposed(); if (queryDescriptors == null) { throw new ArgumentNullException(nameof(queryDescriptors)); } var masksPtrs = new IntPtr[0]; if (masks != null) { masksPtrs = EnumerableEx.SelectPtrs(masks); } using (var matchesVec = new VectorOfVectorDMatch()) { NativeMethods.features2d_DescriptorMatcher_radiusMatch2( ptr, queryDescriptors.CvPtr, matchesVec.CvPtr, maxDistance, masksPtrs, masksPtrs.Length, compactResult ? 1 : 0); GC.KeepAlive(this); GC.KeepAlive(queryDescriptors); GC.KeepAlive(masks); return(matchesVec.ToArray()); } }
/// <summary> /// Find k best matches for each query descriptor (in increasing order of distances). /// compactResult is used when mask is not empty. If compactResult is false matches /// vector will have the same size as queryDescriptors rows. If compactResult is true /// matches vector will not contain matches for fully masked out query descriptors. /// </summary> /// <param name="queryDescriptors"></param> /// <param name="k"></param> /// <param name="masks"></param> /// <param name="compactResult"></param> /// <returns></returns> public DMatch[][] KnnMatch(Mat queryDescriptors, int k, Mat[]?masks = null, bool compactResult = false) { ThrowIfDisposed(); if (queryDescriptors == null) { throw new ArgumentNullException(nameof(queryDescriptors)); } var masksPtrs = Array.Empty <IntPtr>(); if (masks != null) { masksPtrs = masks.Select(x => x.CvPtr).ToArray(); } using var matchesVec = new VectorOfVectorDMatch(); NativeMethods.HandleException( NativeMethods.features2d_DescriptorMatcher_knnMatch2( ptr, queryDescriptors.CvPtr, matchesVec.CvPtr, k, masksPtrs, masksPtrs.Length, compactResult ? 1 : 0)); GC.KeepAlive(this); GC.KeepAlive(queryDescriptors); GC.KeepAlive(masks); return(matchesVec.ToArray()); }
/// <summary> /// Find k best matches for each query descriptor (in increasing order of distances). /// compactResult is used when mask is not empty. If compactResult is false matches /// vector will have the same size as queryDescriptors rows. If compactResult is true /// matches vector will not contain matches for fully masked out query descriptors. /// </summary> /// <param name="queryDescriptors"></param> /// <param name="trainDescriptors"></param> /// <param name="k"></param> /// <param name="mask"></param> /// <param name="compactResult"></param> /// <returns></returns> public DMatch[][] KnnMatch(Mat queryDescriptors, Mat trainDescriptors, int k, Mat? mask = null, bool compactResult = false) { ThrowIfDisposed(); if (queryDescriptors == null) throw new ArgumentNullException(nameof(queryDescriptors)); if (trainDescriptors == null) throw new ArgumentNullException(nameof(trainDescriptors)); using var matchesVec = new VectorOfVectorDMatch(); NativeMethods.HandleException( NativeMethods.features2d_DescriptorMatcher_knnMatch1( ptr, queryDescriptors.CvPtr, trainDescriptors.CvPtr, matchesVec.CvPtr, k, Cv2.ToPtr(mask), compactResult ? 1 : 0)); GC.KeepAlive(this); GC.KeepAlive(queryDescriptors); GC.KeepAlive(trainDescriptors); GC.KeepAlive(mask); return matchesVec.ToArray(); }
/// <summary> /// Find best matches for each query descriptor which have distance less than /// maxDistance (in increasing order of distances). /// </summary> /// <param name="queryDescriptors"></param> /// <param name="trainDescriptors"></param> /// <param name="maxDistance"></param> /// <param name="mask"></param> /// <param name="compactResult"></param> /// <returns></returns> public DMatch[][] RadiusMatch(Mat queryDescriptors, Mat trainDescriptors, float maxDistance, Mat mask = null, bool compactResult = false) { ThrowIfDisposed(); if (queryDescriptors == null) { throw new ArgumentNullException("queryDescriptors"); } if (trainDescriptors == null) { throw new ArgumentNullException("trainDescriptors"); } using (var matchesVec = new VectorOfVectorDMatch()) { NativeMethods.features2d_DescriptorMatcher_radiusMatch1( ptr, queryDescriptors.CvPtr, trainDescriptors.CvPtr, matchesVec.CvPtr, maxDistance, Cv2.ToPtr(mask), compactResult ? 1 : 0); return(matchesVec.ToArray()); } }
/// <summary> /// Find k best matches for each query descriptor (in increasing order of distances). /// compactResult is used when mask is not empty. If compactResult is false matches /// vector will have the same size as queryDescriptors rows. If compactResult is true /// matches vector will not contain matches for fully masked out query descriptors. /// </summary> /// <param name="queryDescriptors"></param> /// <param name="k"></param> /// <param name="masks"></param> /// <param name="compactResult"></param> /// <returns></returns> public DMatch[][] KnnMatch(Mat queryDescriptors, int k, Mat[] masks = null, bool compactResult = false) { ThrowIfDisposed(); if (queryDescriptors == null) { throw new ArgumentNullException("queryDescriptors"); } var masksPtrs = new IntPtr[0]; if (masks != null) { masksPtrs = EnumerableEx.SelectPtrs(masks); } using (var matchesVec = new VectorOfVectorDMatch()) { NativeMethods.features2d_DescriptorMatcher_knnMatch2( ptr, queryDescriptors.CvPtr, matchesVec.CvPtr, k, masksPtrs, masksPtrs.Length, compactResult ? 1 : 0); return(matchesVec.ToArray()); } }