Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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();
            }
        }
Exemple #3
0
        /// <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());
            }
        }
Exemple #4
0
        /// <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());
        }