/// <summary> /// imageの白部分の面積がminArea以上のものだけ反映した画像を返す /// </summary> public static Bitmap GetImageOmitMinimumNoize(Bitmap image, int minArea) { var mat = Cv2.Split(image.ToMat())[0]; ConnectedComponents cc = Cv2.ConnectedComponentsEx(mat); //var maxBlob = cc.GetLargestBlob(); //var filtered = new Mat(); //cc.FilterByBlob(mat, filtered, maxBlob); //Cv2.ImShow("max", filtered); List <ConnectedComponents.Blob> blobs = new List <ConnectedComponents.Blob>(); for (int i = 0; i < cc.LabelCount; i++) { int area = cc.Blobs[i].Area; if (area >= minArea) { blobs.Add(cc.Blobs[i]); } } var filtered = new Mat(); cc.FilterByBlobs(mat, filtered, blobs); return(new Bitmap(filtered.ToBitmap())); }
public ContentUserControlViewModel() { FilePath = string.Empty; BrowseCommand = new DelegateCommand(() => { OpenFileDialog dialog = new OpenFileDialog() { Multiselect = false, CheckPathExists = true, CheckFileExists = true, Filter = "画像ファイル|*.bmp;*.jpg;*.png", }; bool?ret = dialog.ShowDialog(); if (ret.HasValue && ret.Value) { FilePath = dialog.FileName; Mat original = Cv2.ImRead(dialog.FileName); OriginalImage = ToBitmapSource(BitmapConverter.ToBitmap(original)); Mat grayscale = new Mat(); Cv2.CvtColor(original, grayscale, ColorConversionCodes.BGR2GRAY); Mat binary = new Mat(); Cv2.Threshold(grayscale, binary, 0.0, 255.0, ThresholdTypes.Binary | ThresholdTypes.Otsu); Mat labels = new Mat(); ConnectedComponents components = Cv2.ConnectedComponentsEx(binary); Mat segmented = new Mat(); components.RenderBlobs(segmented); SegmentedImage = ToBitmapSource(BitmapConverter.ToBitmap(segmented)); } }); System.Diagnostics.Debug.Print(Cv2.GetVersionString()); }
public static int Labling(this WriteableBitmap src) { using (Mat mat = new Mat(src.PixelHeight, src.PixelWidth, MatType.CV_8UC3)) { src.ToMat(mat); Mat gray = mat.CvtColor(ColorConversionCodes.BGR2GRAY); //Cv2.NamedWindow("image", WindowMode.Normal); //Cv2.ImShow("image", mat); Mat binary = gray.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary); //Cv2.NamedWindow("image", WindowMode.Normal); //Cv2.ImShow("image", binary); //Cv2.WaitKey(); //Cv2.DestroyWindow("image"); ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary); int c = 0; foreach (var i in cc.Blobs) { c += i.Area > 3 ? 1 : 0; } return(c); } }
private static void Blob() { Mat src = new Mat("data/shapes.png", ImreadModes.Color); Mat gray = src.CvtColor(ColorConversionCodes.BGR2GRAY); Mat binary = gray.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary); Mat labelView = new Mat(); Mat rectView = binary.CvtColor(ColorConversionCodes.GRAY2BGR); ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary); if (cc.LabelCount <= 1) { return; } // draw labels /* * Scalar[] colors = cc.Blobs.Select(_ => Scalar.RandomColor()).ToArray(); * int height = cc.Labels.GetLength(0); * int width = cc.Labels.GetLength(1); * var labelViewIndexer = labelView.GetGenericIndexer<Vec3b>(); * for (int y = 0; y < height; y++) * { * for (int x = 0; x < width; x++) * { * int labelValue = cc.Labels[y, x]; * labelViewIndexer[y, x] = colors[labelValue].ToVec3b(); * } * } */ 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 ConnectedComponents.Blob maxBlob = cc.GetLargestBlob(); //cc.Blobs.Skip(1).OrderByDescending(b => b.Area).First(); Mat 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(); } }
public void FilterByLabel() { using var src = new Mat(100, 100, MatType.CV_8UC1, Scalar.Black); Cv2.Rectangle(src, new Rect(10, 20, 10, 20), Scalar.White, -1); Cv2.Rectangle(src, new Rect(50, 60, 20, 30), Scalar.White, -1); // greater var cc = Cv2.ConnectedComponentsEx(src, PixelConnectivity.Connectivity8, ConnectedComponentsAlgorithmsTypes.Default); using var dst = new Mat(); cc.FilterByLabel(src, dst, 1); using var expected = new Mat(100, 100, MatType.CV_8UC1, Scalar.Black); Cv2.Rectangle(expected, new Rect(10, 20, 10, 20), Scalar.White, -1); ShowImagesWhenDebugMode(src, dst, expected); ImageEquals(dst, expected); }
public void Run(PixelConnectivity connectivity, ConnectedComponentsAlgorithmsTypes algorithmType) { using var src = Image("alphabet.png", ImreadModes.Grayscale); using var binary = new Mat(); Cv2.Threshold(src, binary, 128, 255, ThresholdTypes.BinaryInv); ShowImagesWhenDebugMode(src, binary); var cc = Cv2.ConnectedComponentsEx(binary, connectivity, algorithmType); Assert.Equal(27, cc.LabelCount); Assert.NotEmpty(cc.Labels.GetBuffer()); Assert.Equal(src.Rows, cc.Labels.GetLength(0)); Assert.Equal(src.Cols, cc.Labels.GetLength(1)); using var render = new Mat(); cc.RenderBlobs(render); ShowImagesWhenDebugMode(render); }
public void Run() { Mat src = new Mat(FilePath.Image.Shapes, 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(); //} src.SaveImage("src.png"); binary.SaveImage("binary.png"); labelView.SaveImage("labels.png"); rectView.SaveImage("boxes.png"); filtered.SaveImage("maximumblob.png"); }
public void GetLargestBlob() { using var src = new Mat(100, 100, MatType.CV_8UC1, Scalar.Black); Cv2.Rectangle(src, new Rect(10, 20, 10, 20), Scalar.White, -1); Cv2.Rectangle(src, new Rect(50, 60, 20, 30), Scalar.White, -1); // greater ShowImagesWhenDebugMode(src); var cc = Cv2.ConnectedComponentsEx(src, PixelConnectivity.Connectivity8, ConnectedComponentsAlgorithmsTypes.Default); var largestBlob = cc.GetLargestBlob(); Assert.Equal(50, largestBlob.Left); Assert.Equal(60, largestBlob.Top); Assert.Equal(20, largestBlob.Width); Assert.Equal(30, largestBlob.Height); Assert.Equal(new Rect(50, 60, 20, 30), largestBlob.Rect); Assert.Equal(20 * 30, largestBlob.Area); Assert.Equal(new Point2d(59.5, 74.5), largestBlob.Centroid); }
public int GetBlobs(Mat img, bool showImage = false) { Mat gray = img.CvtColor(ColorConversionCodes.BGR2GRAY); //Mat binary = gray.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary); Mat binary = gray.Threshold(50, 255, ThresholdTypes.Binary); //2.Define/search ROI area Mat labelView = img.EmptyClone(); Mat rectView = binary.CvtColor(ColorConversionCodes.GRAY2BGR); ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary); if (cc.LabelCount <= 1) { throw new Exception("no blob found"); } //draw lables cc.RenderBlobs(labelView); //draw boxes except background foreach (var blob in cc.Blobs.Skip(1)) { rectView.Rectangle(blob.Rect, Scalar.Red); } if (showImage == true) { using (new Window("blob image", rectView)) //using (new Window("labelview image", labelView)) { //Cv2.WaitKey(1000); Cv2.WaitKey(0); Cv2.DestroyWindow("blob image"); //Cv2.DestroyWindow("labelview image"); } } return(cc.LabelCount - 1); }
/// <summary> /// 処理実行 /// </summary> public ImageProcessValue Execute(SettingsObj obj) { try { // webカメラキャプチャ var camera = new OpenCvSharp.VideoCapture(0) { //// 解像度の指定 FrameWidth = 1920, FrameHeight = 1080 }; using (camera) { // カメラ内部パラメータ格納用 Mat mtx = new Mat(); Mat dist = new Mat(); // ymlファイルを読み来み計算パラメータを取得 using (var fs = new FileStorage(obj.CalibratinFilePath, FileStorage.Mode.Read)) { mtx = fs["mtx"].ReadMat(); dist = fs["dist"].ReadMat(); } var src = new Mat(); // 撮影画像の読み取り camera.Read(src); if (src.Empty()) { return(null); } Mat calib = new Mat(); // 歪み補正 Cv2.Undistort(src, calib, mtx, dist); // 画像処理 var tmp = new Mat(); // OpenCVのカラーの並びに変換 Cv2.CvtColor(calib, tmp, OpenCvSharp.ColorConversionCodes.RGB2BGR); // BGR画像をHSV画像に変換 var hsv = new Mat(); Cv2.CvtColor(tmp, hsv, OpenCvSharp.ColorConversionCodes.BGR2HSV); // inRange関数で範囲指定2値化 -> マスク画像として使う var msk = new Mat(); Cv2.InRange(hsv, new Scalar(obj.HueMin, obj.SaturationMin, obj.ValueMin), new Scalar(obj.HueMax, obj.SaturationMax, obj.ValueMax), msk); // bitwise_andで元画像にマスクをかける -> マスクされた部分の色だけ残る var msk_src = new Mat(); Cv2.BitwiseAnd(hsv, hsv, msk_src, msk); var show_msk = new Mat(); // 元の色に戻す Cv2.CvtColor(msk_src, show_msk, ColorConversionCodes.HSV2BGR); // グレースケール変換 var gray = new Mat(); Cv2.CvtColor(show_msk, gray, ColorConversionCodes.BGR2GRAY); // 2値化 var th = new Mat(); Cv2.Threshold(gray, th, 130, 255, ThresholdTypes.Otsu); // ブロブとラベリング var label = new Mat(); var stats = new Mat(); var centroids = new Mat(); ConnectedComponents cc = Cv2.ConnectedComponentsEx(th); if (cc.LabelCount <= 1) { return(null); } // draw labels //cc.RenderBlobs(show_msk); // draw bonding boxes except background foreach (var blob in cc.Blobs.Skip(1)) { show_msk.Rectangle(blob.Rect, Scalar.Red); } // filter maximum blob var maxBlob = cc.GetLargestBlob(); var filtered = new Mat(); cc.FilterByBlob(show_msk, filtered, maxBlob); // 矩形探索 // マスク画像から矩形探索 Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(th, out contours, out hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxNone); // 見つからなかったら何もしない if (contours.Length == 0) { return(null); } // 回転を考慮した外接矩形 foreach (var cont in contours) { var rect = Cv2.MinAreaRect(cont); var box = Cv2.BoxPoints(rect).Select(x => (Point)x); } Cv2.DrawContours(show_msk, contours, -1, Scalar.Yellow, 3); //Cv2.ImShow("show_msk", show_msk); // 画像、画像上の位置発火 var val = new ImageProcessValue(); val.CameraImage = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(show_msk); val.Blob = maxBlob; // メモリリーク対策でDispose呼ぶ mtx.Dispose(); dist.Dispose(); calib.Dispose(); tmp.Dispose(); hsv.Dispose(); msk.Dispose(); msk_src.Dispose(); show_msk.Dispose(); gray.Dispose(); th.Dispose(); label.Dispose(); stats.Dispose(); centroids.Dispose(); filtered.Dispose(); return(val); } } catch (Exception e) { throw e; } }