public void Run()
        {
            Mat src = new Mat("Data/Image/shapes.png", ImreadModes.Color);
            Mat gray = src.CvtColor(ColorConversionCodes.BGR2GRAY);
            Mat binary = gray.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);
            Mat labelView = src.EmptyClone();
            Mat rectView = binary.CvtColor(ColorConversionCodes.GRAY2BGR);

            ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary);
            if (cc.LabelCount <= 1)
                return;

            // draw labels
            cc.RenderBlobs(labelView);

            // draw bonding boxes except background
            foreach (var blob in cc.Blobs.Skip(1))
            {
                rectView.Rectangle(blob.Rect, Scalar.Red);
            }

            // filter maximum blob
            var maxBlob = cc.GetLargestBlob();
            var filtered = new Mat();
            cc.FilterByBlob(src, filtered, maxBlob);

            using (new Window("src", src))
            using (new Window("binary", binary))
            using (new Window("labels", labelView))
            using (new Window("bonding boxes", rectView))
            using (new Window("maximum blob", filtered))
            {
                Cv2.WaitKey();
            }
        }
Exemplo n.º 2
0
	// Update is called once per frame
	void Update () {
		if (isVid) {
			cap.Read (frame);
		}

		if (!frame.Empty()){
			
			//assume this part of the frame contains only background
			bkrnd_win = frame.Clone(bkrnd_rect);

			bkrnd_win = bkrnd_win.CvtColor(ColorConversionCodes.BGR2HSV);
			frame_hsv = frame.CvtColor (ColorConversionCodes.BGR2HSV);

			Rangef[] ranges = { new Rangef (0, 180) }; 

			//calc the *h* (hsv) histogram of the background
			Cv2.CalcHist (new Mat[]{ bkrnd_win }, new int[]{ 0 }, null, hist, 1, new int[]{ 180 }, ranges);
			hist = hist.Normalize (0, 255, NormTypes.MinMax);

			Cv2.CalcBackProject (new Mat[]{ frame_hsv }, new int[]{ 0 }, hist, frame_backproj, ranges);

			Mat kernel = Cv2.GetStructuringElement (MorphShapes.Ellipse, new Size (7, 7));
			Cv2.Filter2D (frame_backproj, dst, dst.Type (), kernel);

			Cv2.Threshold (dst, thresh, 10.0, 255.0, ThresholdTypes.Binary);
			thresh = 255 - thresh;
			//Debug.Log (thresh.Size ().ToString ());

			Cv2.MorphologyEx (thresh, thresh, MorphTypes.Open, kernel,null,3);
			Cv2.MorphologyEx (thresh, thresh, MorphTypes.ERODE, kernel,null,1);

			contours = Cv2.FindContoursAsMat (thresh , RetrievalModes.List, ContourApproximationModes.ApproxSimple);

			max_area_contour = 0;
			max_area_contour_ind = 0;
			for (int i = 0; i < contours.Length; i++) {
				if (contours [i].ContourArea () > max_area_contour) {
					max_area_contour = contours [i].ContourArea ();
					max_area_contour_ind = i;	
				}							
			}		

			mask = new Mat (thresh.Size (), thresh.Type (), Scalar.All (0));
			//Cv2.DrawContours (mask, contours, 0, Scalar.All (255));
			//Debug.Log(max_area_contour_ind.ToString());
			//mask.DrawContours(contours, 1,Scalar.All (255));



			Cv2.Merge(new Mat[]{mask,mask,mask},mask);
			Cv2.BitwiseAnd (mask, frame, mask);

			//Cv2.Merge(new Mat[]{frame_backproj,frame_backproj,frame_backproj},frame_backproj);

			tex.LoadImage (frame.ToBytes (".png", new int[]{ 0 }));
			
		}

	}
Exemplo n.º 3
0
        public void Run(cv.Mat input, cv.Mat output, cv.SimpleBlobDetector.Params detectorParams)
        {
            var binaryImage = input.CvtColor(cv.ColorConversionCodes.BGR2GRAY);

            cv.Cv2.Threshold(binaryImage, binaryImage, thresh: 100, maxval: 255, type: cv.ThresholdTypes.Binary);

            var simpleBlobDetector = cv.SimpleBlobDetector.Create(detectorParams);
            var keyPoints          = simpleBlobDetector.Detect(binaryImage);

            cv.Cv2.DrawKeypoints(
                image: binaryImage,
                keypoints: keyPoints,
                outImage: output,
                color: cv.Scalar.FromRgb(255, 0, 0),
                flags: cv.DrawMatchesFlags.DrawRichKeypoints);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 图像模板匹配
        /// </summary>
        /// <returns></returns>
        public static void MatMatch()
        {
            //OCS.Extensions.BitmapConverter.ToMat(Resources.all);
            var template  = @"C:\Users\Bit\Desktop\aaaaaaaaaaaaaaaaaa\6\template.jpg";
            var reference = @"C:\Users\Bit\Desktop\aaaaaaaaaaaaaaaaaa\6\reference.jpg";

            using (var referenceMat = new OCS.Mat(reference))
                using (var templateMat = new OCS.Mat(template))
                    using (var res = new OCS.Mat(referenceMat.Rows - templateMat.Rows + 1, referenceMat.Cols - templateMat.Cols + 1, OCS.MatType.CV_32FC1))
                    {
                        //Convert input images to gray
                        var gref = referenceMat.CvtColor(OCS.ColorConversionCodes.BGR2GRAY);
                        var gtpl = templateMat.CvtColor(OCS.ColorConversionCodes.BGR2GRAY);

                        OCS.Cv2.MatchTemplate(gref, gtpl, res, OCS.TemplateMatchModes.CCoeffNormed);
                        OCS.Cv2.Threshold(res, res, 0.8, 1.0, OCS.ThresholdTypes.Tozero);

                        while (true)
                        {
                            double    minval, maxval, threshold = 0.8;
                            OCS.Point minloc, maxloc;
                            OCS.Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);

                            if (maxval >= threshold)
                            {
                                //Setup the rectangle to draw
                                var r = new OCS.Rect(new OCS.Point(maxloc.X, maxloc.Y), new OCS.Size(templateMat.Width, templateMat.Height));

                                //Draw a rectangle of the matching area
                                OCS.Cv2.Rectangle(referenceMat, r, OCS.Scalar.LimeGreen, 2);

                                //Fill in the res Mat so you don't find the same area again in the MinMaxLoc
                                OCS.Rect outRect;
                                OCS.Cv2.FloodFill(res, maxloc, new OCS.Scalar(0), out outRect, new OCS.Scalar(0.1), new OCS.Scalar(1.0));
                            }
                            else
                            {
                                break;
                            }
                        }

                        //OCS.Cv2.ImShow("Matches", referenceMat);
                        //OCS.Cv2.WaitKey();
                    }
        }
Exemplo n.º 5
0
        // public cv.KeyPoint[] keypoint;
        public void Run(cv.Mat input, cv.Mat output, cv.SimpleBlobDetector.Params detectorParams)
        {
            var binaryImage = input.CvtColor(cv.ColorConversionCodes.BGR2GRAY);

            cv.Cv2.Threshold(binaryImage, binaryImage, thresh: 0, maxval: 255, type: cv.ThresholdTypes.Binary);

            var simpleBlobDetector = cv.SimpleBlobDetector.Create(detectorParams);
            //var mask = new cv.Mat(input.Size(), cv.MatType.CV_8UC1, 0);
            //var descriptors = new cv.Mat(input.Size(), cv.MatType.CV_8UC1, 0);
            //simpleBlobDetector.DetectAndCompute(binaryImage, mask, out keypoint, descriptors);

            var keypoint = simpleBlobDetector.Detect(input);

            cv.Cv2.DrawKeypoints(
                image: binaryImage,
                keypoints: keypoint,
                outImage: output,
                color: cv.Scalar.FromRgb(255, 0, 0),
                flags: cv.DrawMatchesFlags.DrawRichKeypoints);
        }
	// Update is called once per frame
	void Update () {
		if (isVid) {
			cap.Read (frame);
		}

		if (!frame.Empty()){
			
			bkrnd_win = frame.Clone(bkrnd_rect);

			//calc the hsv histogram inside that window
			Rangef[] ranges = { new Rangef (0, 180), new Rangef (0, 256) }; 
			bkrnd_win = bkrnd_win.CvtColor(ColorConversionCodes.BGR2HSV);


			frame_hsv = frame.CvtColor (ColorConversionCodes.BGR2HSV);

			Cv2.CalcHist (new Mat[]{ bkrnd_win }, new int[]{ 0, 1 }, null, hist, 2, new int[]{ 180, 256 }, ranges);
			hist = hist.Normalize (0, 255, NormTypes.MinMax);

			Point min_loc, max_loc;
			Cv2.MinMaxLoc (hist, out min_loc, out max_loc);
			Debug.Log (max_loc.X.ToString ());


			//double[] lowerb = {0,0,0};
			//double[] upperb = {180,255,255};

			//Mat M = new Mat(1, 3, frame_hsv.Type(), Scalar (0, 0, 0));

			Mat lowerb = new Mat (new Size (1, 3), frame_hsv.Type (), Scalar.All(100));
			Mat upperb = new Mat(new Size(1,3), frame_hsv.Type(),Scalar.All(255));

			//Debug.Log(frame_hsv.Type().ToString());
			Cv2.InRange (frame_hsv, lowerb, upperb, frame_backproj);
			//Cv2.CalcBackProject (new Mat[]{ frame_hsv }, new int[]{ 0, 1 }, hist, frame_backproj, ranges);



			Mat kernel = Cv2.GetStructuringElement (MorphShapes.Ellipse, new Size (5, 5));
			Cv2.Filter2D (frame_backproj, mask, mask.Type (), kernel);

			//thresh = Cv2.Threshold (mask, mask, 0.0, 255.0, ThresholdTypes.Otsu);

			//mask = 255 - mask;


			kernel = Cv2.GetStructuringElement (MorphShapes.Rect, new Size (3, 3));
			Cv2.MorphologyEx (mask, mask, MorphTypes.ERODE, kernel,null,2);

			kernel = Cv2.GetStructuringElement (MorphShapes.Rect, new Size (15, 15));
			Cv2.MorphologyEx (mask, mask, MorphTypes.Close, kernel,null,5);


			Cv2.Merge(new Mat[]{mask,mask,mask},mask);
			Cv2.BitwiseAnd (mask, frame, mask);

			Cv2.Merge(new Mat[]{frame_backproj,frame_backproj,frame_backproj},frame_backproj);

			tex.LoadImage (frame_backproj.ToBytes (".png", new int[]{ 0 }));
			
		}

	}
Exemplo n.º 7
0
        private void Init()
        {
            new Thread(() =>
            {
                var eye_casc       = new cv.CascadeClassifier("eye.xml");
                var left_eye_casc  = new cv.CascadeClassifier("left_eye.xml");
                var right_eye_casc = new cv.CascadeClassifier("right_eye.xml");
                var face_casc      = new cv.CascadeClassifier("fface_default.xml");

                cap = new cv.VideoCapture(0);

                while (true)
                {
                    if (released)
                    {
                        break;
                    }
                    var img = new cv.Mat();
                    cap.Read(img);
                    var gray  = img.CvtColor(cv.ColorConversionCodes.BGR2GRAY);
                    var gaus  = gray.AdaptiveThreshold(255, cv.AdaptiveThresholdTypes.GaussianC, cv.ThresholdTypes.Binary, 115, 1);
                    img       = gaus;
                    var faces = face_casc.DetectMultiScale(gray, 1.3, 5);
                    RenderTargetBitmap eyes_lay = null;

                    foreach (var face in faces)
                    {
                        var rect = new cv.Rect(face.Location, face.Size);
                        //img.Rectangle(rect, new cv.Scalar(255, 0, 0));

                        var sub_ing     = gray[rect];
                        var sub_ing_rgb = img[rect];

                        //left eye
                        var eyes  = eye_casc.DetectMultiScale(sub_ing, 1.3, 2);
                        int count = 0;
                        foreach (var eye in eyes)
                        {
                            count++;
                            if (count > 2)
                            {
                                count = 0;
                                break;
                            }
                            var rect_eye = new cv.Rect(eye.Location, eye.Size);

                            if (eye.X + eye.Width < face.Width / 2)
                            {
                                //sub_ing_rgb.Rectangle(rect_eye, new cv.Scalar(0, 255, 0));
                                Dispatcher.Invoke(() =>
                                {
                                    eyes_lay = DrawImg(cv.Extensions.BitmapSourceConverter.ToBitmapSource(img), eye.X + face.X, eye.Y + face.Y, eye.Width, eye.Height, eye_l, scale_w, scale_h);
                                });
                            }
                        }

                        //left eye
                        count = 0;
                        foreach (var eye in eyes)
                        {
                            count++;
                            if (count > 2)
                            {
                                break;
                            }
                            var rect_eye = new cv.Rect(eye.Location, eye.Size);

                            if (eye.X + eye.Width > face.Width / 2)
                            {
                                Dispatcher.Invoke(() =>
                                {
                                    if (eyes_lay != null)
                                    {
                                        eyes_lay = DrawImg(eyes_lay, eye.X + face.X, eye.Y + face.Y, eye.Width, eye.Height, eye_r, scale_w, scale_h);
                                    }
                                    else
                                    {
                                        eyes_lay = DrawImg(cv.Extensions.BitmapSourceConverter.ToBitmapSource(img), eye.X + face.X, eye.Y + face.Y, eye.Width, eye.Height, eye_r, scale_w, scale_h);
                                    }
                                });
                            }
                        }
                    }



                    Dispatcher.Invoke(() =>
                    {
                        if (eyes_lay != null)
                        {
                            OutImg.Source = eyes_lay;
                        }
                        else
                        {
                            OutImg.Source = cv.Extensions.BitmapSourceConverter.ToBitmapSource(img);
                        }
                    });
                    //Thread.Sleep(100);
                    GC.Collect();
                }
            })
            {
                IsBackground = true
            }.Start();
        }
Exemplo n.º 8
0
        public static Mat ExtractMask(Mat srcMat, ColorConversionCodes code,
        int ch1Lower, int ch1Upper,
        int ch2Lower, int ch2Upper,
        int ch3Lower, int ch3Upper)
        {
            if (srcMat == null)
                throw new ArgumentNullException("srcMat");

            var colorMat = srcMat.CvtColor(code);

            var lut = new Mat(256, 1, MatType.CV_8UC3);

            var lower = new int[3] { ch1Lower, ch2Lower, ch3Lower };
            var upper = new int[3] { ch1Upper, ch2Upper, ch3Upper };

            // cv::Mat_<cv::Vec3b>
            var mat3 = new MatOfByte3(lut);

            var indexer = mat3.GetIndexer();

            for (int i = 0; i < 256; i++)
            {
                var color = indexer[i];
                byte temp;

                for (int k = 0; k < 3; k++)
                {

                    if (lower[k] <= upper[k])
                    {
                        if ((lower[k] <= i) && (i <= upper[k]))
                        {
                            temp = 255;
                        }
                        else
                        {
                            temp = 0;
                        }
                    }
                    else
                    {
                        if ((i <= upper[k]) || (lower[k] <= i))
                        {
                            temp = 255;
                        }
                        else
                        {
                            temp = 0;
                        }
                    }

                    color[k] = temp;
                }

                indexer[i] = color;
            }

            Cv2.LUT(colorMat, lut, colorMat);

            var channelMat = colorMat.Split();

            var maskMat = new Mat();

            Cv2.BitwiseAnd(channelMat[0], channelMat[1], maskMat);
            Cv2.BitwiseAnd(maskMat, channelMat[2], maskMat);
            return maskMat;
        }