プロジェクトの作成
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の場合
全ての図形が消去される。
コメント