/// <summary>
        /// Check if the object blob found in inputImage is within the boundry
        /// Inside, return true, outside, return false
        /// </summary>
        /// <param name="inputImage"></param>
        /// <param name="boundry"></param>
        /// <returns></returns>
        public static bool mCheckBoundry(Image <Bgr, byte> inputImage, Rectangle boundry)
        {
            Image <Gray, byte> grayImg = inputImage.Convert <Gray, byte>();

            grayImg = ImageProcessing.colorFilter(grayImg);

            Rectangle[] rect;
            ContourDetection.contourDetection(grayImg.Convert <Bgr, byte>(), out rect);
            return(rectInsideRect(rect[0], boundry));
        }
        public static int findMinDistance(Image <Bgr, Byte> imgOriginal)
        {
            ContourDetection.contourDetection(imgOriginal, false, false, "", out contourArea, out contourRect, out contourPoints);

            int minVal = imgOriginal.Width;

            foreach (Point p in contourPoints)
            {
                if (p.X < minVal)
                {
                    minVal = p.X;
                }
            }
            return(minVal);
        }
        public static Image <Bgr, byte> Detection(Image <Bgr, byte> originalImage, DetectionType DT, out ErrorCode Err)
        {
            Err = ErrorCode.Normal;
            Image <Bgr, byte> b = null;

            switch (DT)
            {
            case DetectionType.Feature:
                switch (_featureType)
                {
                case featureDetectionType.cannyEdge:
                    b = ContourDetection.cannyEdges(originalImage, false).Convert <Bgr, Byte>(); break;

                case featureDetectionType.contour:
                    b = ContourDetection.contourDetection(originalImage); break;

                case featureDetectionType.line:
                    b = LineDetection.lineDetection(originalImage); break;
                }
                break;

            case DetectionType.Object:
                if (GV.imgOriginal != null && GV.object_img != null)
                {
                    Image <Bgr, byte> outPutImg = GV.imgOriginal;
                    switch (_objectType)
                    {
                    case objectDetectionType.SURF:
                        if (!SURF.SearchObject_SURF(GV.imgOriginal.Convert <Gray, byte>(), GV.object_img.Convert <Gray, byte>(), out outPutImg))
                        {
                            Err = ErrorCode.SearchSURF_Fail;
                        }
                        else
                        {
                            BindManager.BindMngr.GMessage.value = "Found using SURF";
                        }
                        b = outPutImg; break;

                    case objectDetectionType.FFT:
                        if (!FFT.searchObject_FFT(GV.imgOriginal, GV.object_img, out outPutImg))
                        {
                            Err = ErrorCode.SearchFFT_Fail;
                        }
                        else
                        {
                            BindManager.BindMngr.GMessage.value = "Found using FFT";
                        }
                        b = outPutImg; break;

                    case objectDetectionType.color:
                        if (!ColorDetection2.Color_detection(GV.imgOriginal, GV.object_img, out outPutImg, Parameters._colorTolerance))
                        {
                            Err = ErrorCode.SearchColor_Fail;
                        }
                        else
                        {
                            //outPutImg = ContourDetection.contourDetection(outPutImg);
                            PointF[] pts = FindWhitePoints(outPutImg.Convert <Gray, byte>());

                            MCvBox2D box = SquareFittingWithAngle(pts);
                            outPutImg.Draw(box, new Bgr(Color.Green), 2);
                            BindManager.BindMngr.GMessage.value = $"Displaying matching colors. Angle [{box.angle}deg]";
                        }
                        b = outPutImg; break;
                    }
                }
                else if (GV.object_img == null)
                {
                    Err = ErrorCode.No_object_image;
                }

                break;
            }
            return(b);
        }