/// <summary>
        /// Downloads results from cuda::HoughCirclesDetector::detect to host memory.
        /// </summary>
        /// <param name="d_circles">Result of cuda::HoughCirclesDetector::detect .</param>
        /// <param name="c_circles">Output host array.</param>
        /// <param name="stream">Stream for the asynchronous version.</param>
        public virtual void downloadResults(InputArray d_circles, out CircleSegment[] c_circles, Stream stream = null)
        {
            if (d_circles == null)
            {
                throw new ArgumentNullException(nameof(d_circles));
            }
            d_circles.ThrowIfDisposed();

            using (var vec = new VectorOfVec3f()) {
                NativeMethods.cuda_imgproc_HoughCirclesDetector_downloadResults(ptr, d_circles.CvPtr, vec.CvPtr
                                                                                , stream?.CvPtr ?? Stream.Null.CvPtr);
                c_circles = vec.ToArray <CircleSegment>();
            }

            GC.KeepAlive(this);
            GC.KeepAlive(d_circles);
            GC.KeepAlive(c_circles);
        }
        /// <summary>
        /// ハフ変換を用いて,グレースケール画像から円を検出します.
        /// </summary>
        /// <param name="image">8ビット,シングルチャンネル,グレースケールの入力画像></param>
        /// <param name="method">現在のところ,HoughCirclesMethod.Gradient メソッドのみが実装されている.</param>
        /// <param name="dp">画像分解能に対する投票分解能の比率の逆数.</param>
        /// <param name="minDist">検出される円の中心同士の最小距離.</param>
        /// <param name="param1">手法依存の1番目のパラメータ.[既定値は100]</param>
        /// <param name="param2">手法依存の2番目のパラメータ.[既定値は100]</param>
        /// <param name="minRadius">円の半径の最小値 [既定値は0]</param>
        /// <param name="maxRadius">円の半径の最大値 [既定値は0]</param>
        /// <returns>検出された円.各ベクトルは,3要素の浮動小数点型ベクトル (x, y, radius) としてエンコードされます</returns>
#else
        /// <summary>
        /// Finds circles in a grayscale image using a Hough transform.
        /// </summary>
        /// <param name="image">The 8-bit, single-channel, grayscale input image</param>
        /// <param name="method">Currently, the only implemented method is HoughCirclesMethod.Gradient</param>
        /// <param name="dp">The inverse ratio of the accumulator resolution to the image resolution. </param>
        /// <param name="minDist">Minimum distance between the centers of the detected circles. </param>
        /// <param name="param1">The first method-specific parameter. [By default this is 100]</param>
        /// <param name="param2">The second method-specific parameter. [By default this is 100]</param>
        /// <param name="minRadius">Minimum circle radius. [By default this is 0]</param>
        /// <param name="maxRadius">Maximum circle radius. [By default this is 0] </param>
        /// <returns>The output vector found circles. Each vector is encoded as 3-element floating-point vector (x, y, radius)</returns>
#endif
        public static CvCircleSegment[] HoughCircles(InputArray image, HoughCirclesMethod method, double dp, double minDist, 
            double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0)
        {
            if (image == null)
                throw new ArgumentNullException("image");
            image.ThrowIfDisposed();
            using (var vec = new VectorOfVec3f())
            {
                NativeMethods.imgproc_HoughCircles(image.CvPtr, vec.CvPtr, (int)method, dp, minDist, param1, param2, minRadius, maxRadius);
                return vec.ToArray<CvCircleSegment>();
            }
        }