WPF学習中「OpenCvSharpで指定サイズより小さい図形を消す」

C# コンピュータ
C#

プロジェクトの作成

mkdir プロジェクト名
cd プロジェクト名
dotnet new wpf
dotnet add package OpenCvSharp4.Windows
code .

ソースコード

ファイル名:MainWindow.xaml

<Window x:Class="ZukeiSyoukyo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ZukeiSyoukyo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image x:Name="Image1" />
    </Grid>
</Window>

ファイル名:MainWindow.xaml.cs

using System.Diagnostics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using OpenCvSharp;
using OpenCvSharp.WpfExtensions;

namespace ZukeiSyoukyo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();

            using(var mat = new Mat(new OpenCvSharp.Size(256, 256), MatType.CV_8U, Scalar.All(255)))
            {
                const double DOT_SIZE = 0.0;
                // const double DOT_SIZE = 100.0;
                // const double DOT_SIZE = 2500.0;
                // const double DOT_SIZE = 10000.0;

                // 四角形小
                Cv2.Rectangle(mat, new OpenCvSharp.Rect(10,100,10,10), new Scalar(0));
                Cv2.FloodFill(mat, new OpenCvSharp.Point(11,101), new Scalar(0));

                // 四角形中
                Cv2.Rectangle(mat, new OpenCvSharp.Rect(30,100,50,50), new Scalar(0));
                Cv2.FloodFill(mat, new OpenCvSharp.Point(31,101), new Scalar(0));

                // 四角形大
                Cv2.Rectangle(mat, new OpenCvSharp.Rect(90,100,100,100), new Scalar(0));
                Cv2.FloodFill(mat, new OpenCvSharp.Point(91,101), new Scalar(0));


                // 2値化
                var th = mat.Clone();
                Cv2.AdaptiveThreshold(mat, th, 255, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.BinaryInv, 11, 2.0);

                // 図形の検出
                OpenCvSharp.Point[][] contours;
                OpenCvSharp.HierarchyIndex[] hierarchy;
                Cv2.FindContours(th, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone);

                List<List<OpenCvSharp.Point>> targets = new();

                foreach(var c in contours)
                {
                    if (Math.Abs(Cv2.ContourArea(c)) <= DOT_SIZE)
                    {
                        targets.Add(new List<OpenCvSharp.Point>(c));
                    }
                }

                // 検出図形を白で塗りつぶし
                Cv2.DrawContours(mat, targets, -1, new Scalar(255), -1);

                Image1.Source = BitmapSourceConverter.ToBitmapSource(mat);
            }
        }
    }
}

実行結果

DOT_SIZE = 0.0の場合


全ての図形(四角形)が表示

DOT_SIZE = 100.0の場合


左側の図形が消去される。

DOT_SIZE = 2500.0の場合


左側と真ん中の図形が消去される。

DOT_SIZE = 10000.0の場合


全ての図形が消去される。

コメント