Exemple #1
0
        /// <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());
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
        }
Exemple #9
0
        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;
            }
        }