public static Rectangle[] FindPerson(IInputArray image, out long processingTime)
        {
            Stopwatch watch = new Stopwatch();

            Rectangle[] regions = null;


            if (Controller.Instance.Cuda)
            {
                GpuMat GpuImage = new GpuMat(image);

                using (InputArray iaImage = GpuImage.GetInputArray())
                {
                    //if the input array is a GpuMat
                    //check if there is a compatible Cuda device to run pedestrian detection
                    if (iaImage.Kind == InputArray.Type.CudaGpuMat)
                    {
                        //this is the Cuda version
                        using (CudaHOG des = new CudaHOG(
                                   new Size(64, 128),
                                   new Size(16, 16),
                                   new Size(8, 8),
                                   new Size(8, 8)))
                        {
                            des.SetSVMDetector(des.GetDefaultPeopleDetector());

                            watch = Stopwatch.StartNew();
                            using (GpuMat cudaBgra = new GpuMat())
                                using (VectorOfRect vr = new VectorOfRect())
                                {
                                    CudaInvoke.CvtColor(image, cudaBgra, ColorConversion.Bgr2Bgra);
                                    des.DetectMultiScale(cudaBgra, vr);
                                    regions = vr.ToArray();
                                }
                        }
                    }
                }
            }
            else
            {
                using (InputArray iaImage = image.GetInputArray())
                {
                    //this is the CPU/OpenCL version
                    using (HOGDescriptor des = new HOGDescriptor())
                    {
                        des.SetSVMDetector(HOGDescriptor.GetDefaultPeopleDetector());
                        watch = Stopwatch.StartNew();

                        MCvObjectDetection[] results = des.DetectMultiScale(image);
                        regions = new Rectangle[results.Length];
                        for (int i = 0; i < results.Length; i++)
                        {
                            regions[i] = results[i].Rect;
                        }
                        watch.Stop();
                    }
                }
            }


            processingTime = watch.ElapsedMilliseconds;

            return(regions);
        }