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(); } }
// 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 })); } }
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); }
/// <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(); } }
// 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 })); } }
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(); }
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; }