/// <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());
            }
        }
Пример #2
0
        /// <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());
        }
Пример #3
0
 /// <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());
            }
        }