Dodaj pliki projektów.

This commit is contained in:
THE_KONDRAT 2023-09-30 20:24:02 +03:00
parent 0a5bd4d55b
commit 7f28de2ce3
10 changed files with 638 additions and 0 deletions

View File

@ -0,0 +1,8 @@
namespace Domain.Abstractions;
public interface ILayer
{
public uint Order { get; }
public OpticalSchema OpticalSchema { get; }
public Task Execute();
}

9
Domain/Domain.csproj Normal file
View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

17
Domain/OpticalSchema.cs Normal file
View File

@ -0,0 +1,17 @@
namespace Domain;
public enum OpticalSchema
{
/// <summary>
/// SP 0
/// </summary>
Sp0,
/// <summary>
/// SP 0.1
/// </summary>
Sp01,
/// <summary>
/// SP 1.1
/// </summary>
Sp11,
}

31
Make3.Renderer.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34031.279
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Make3.Renderer", "Make3.Renderer\Make3.Renderer.csproj", "{570EF7F2-630F-44A5-8CB9-247F34B6FC18}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{5D88EEB2-A075-4531-890E-DC38E2700325}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{570EF7F2-630F-44A5-8CB9-247F34B6FC18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{570EF7F2-630F-44A5-8CB9-247F34B6FC18}.Debug|Any CPU.Build.0 = Debug|Any CPU
{570EF7F2-630F-44A5-8CB9-247F34B6FC18}.Release|Any CPU.ActiveCfg = Release|Any CPU
{570EF7F2-630F-44A5-8CB9-247F34B6FC18}.Release|Any CPU.Build.0 = Release|Any CPU
{5D88EEB2-A075-4531-890E-DC38E2700325}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5D88EEB2-A075-4531-890E-DC38E2700325}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D88EEB2-A075-4531-890E-DC38E2700325}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D88EEB2-A075-4531-890E-DC38E2700325}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2158B183-2CF0-407A-A5BC-8CF3BBD87FEB}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,26 @@
using Domain;
using Domain.Abstractions;
namespace Make3.Renderer.Layers;
internal abstract class LayerBase : ILayer
{
public uint Order { get; private set; }
public abstract OpticalSchema OpticalSchema { get; }
protected LayerBase(uint order)
{
Order = order;
}
public async Task Execute()
{
await Render();
}
protected virtual Task Render()
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,45 @@
using Domain;
namespace Make3.Renderer.Layers.TrekoLayers
{
internal class Treko : LayerBase
{
public override OpticalSchema OpticalSchema => OpticalSchema.Sp0;
internal Treko(uint order) : base(order) { }
protected override Task Render()
{
var a = Step3(Step2(Step1()));
//return base.Render();
return Task.CompletedTask;
}
protected string Step1()
{
Step1_1();
return "";
}
protected string Step1_1()
{
return "";
}
private string Step2(string inputValue)
{
return "nothing";
}
private int Step3(string inputValue)
{
return 0;
}
}
}

View File

@ -0,0 +1,17 @@
using Domain;
namespace Make3.Renderer.Layers.TrekoLayers
{
internal class Treko3d : LayerBase
{
public override OpticalSchema OpticalSchema => OpticalSchema.Sp0;
internal Treko3d(uint order) : base(order) { }
protected override Task Render()
{
return base.Render();
}
}
}

View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenCvSharp4" Version="4.8.0.20230708" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.8.0.20230708" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\Domain.csproj" />
</ItemGroup>
</Project>

44
Make3.Renderer/Program.cs Normal file
View File

@ -0,0 +1,44 @@
// See https://aka.ms/new-console-template for more information
using Domain.Abstractions;
using Make3.Renderer;
using Make3.Renderer.Layers.TrekoLayers;
using OpenCvSharp;
Console.WriteLine("Hello, World!");
var filePath = @"F:\GS_TEST.png";
filePath = @"F:\GS_TEST_1.png";
using (var s = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var testClass = new TestClass(s);
testClass.Execute();
}
Console.ReadLine();
//входные данные
var projectLayers = new List<ILayer>
{
new Treko(0),
new Treko(1),
new Treko(2),
};
//программа
projectLayers.Sort((a, b) => a.Order.CompareTo(b.Order));
for (int i = 0; i < projectLayers.Count; i++)
{
await projectLayers[i].Execute();
}
//List<ushort> ImageColors(Mat image)
//{
//}
class ShapeInfo
{
public Point[][] Points { get; set; }
public byte Color { get; set; }
}

422
Make3.Renderer/TestClass.cs Normal file
View File

@ -0,0 +1,422 @@
using OpenCvSharp;
namespace Make3.Renderer
{
internal class TestClass
{
private readonly Mat _inputMat;
public TestClass(Stream stream)
{
_inputMat = Mat.FromStream(stream, ImreadModes.Grayscale); ;
}
public TestClass(Mat inputMat)
{
_inputMat = inputMat;
}
internal void Execute()
{
var colors = GetColors();
var c = _inputMat.Threshold(0, 255, ThresholdTypes.Binary & ThresholdTypes.Otsu);
var closing = c.EmptyClone();
Cv2.MorphologyEx(c, closing, MorphTypes.Close, null);
//var contours0 = closing.FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);
Point[][] contours;
HierarchyIndex[] hierarchy;
//closing.FindContours(out contours1, , RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
closing.FindContours(out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
var contNum = 0;
//var allContursColored = GetContoursColored(contours, hierarchy, contNum);
var allConturs = GetContoursBW(contours, hierarchy, contNum);
allConturs.SaveImage(@$"F:\GS_TEST_c{contNum}.png");
//colorSeparatedMats.Add(c);
allConturs.SaveImage(@$"F:\GS_TEST_cc{contNum}.png");
DistanceTransform(allConturs, contNum);
}
private List<ushort> GetColors()
{
var nonZero = _inputMat.FindNonZero();
var colors = new List<ushort>();
var total = nonZero.Total();
for (int i = 0; i < total; i++)
{
var p = nonZero.At<Point>(i);
var color = _inputMat.At<byte>(p.X, p.Y);
if (!colors.Contains(color) && color != 0) colors.Add(color);
}
return colors;
}
private Mat GetContoursColored(Point[][] contours, HierarchyIndex[] hierarchy, int contur)
{
var result = Mat.Zeros(_inputMat.Size(), MatType.CV_8UC3).ToMat();
Cv2.DrawContours(result, contours, contur, new Scalar(hierarchy[contur].Parent < 0 ? 255 : 0, 128, 20 * contur), -1,
hierarchy: hierarchy,
maxLevel: int.MaxValue);
return result;
}
/// <summary>
/// sdfsd
/// </summary>
/// <param name="contours"></param>
/// <param name="hierarchy"></param>
/// <param name="contur"></param>
/// <returns></returns>
private Mat GetContoursBW(Point[][] contours, HierarchyIndex[] hierarchy, int contur)
{
var result = Mat.Zeros(_inputMat.Size(), MatType.CV_8UC1).ToMat();
Cv2.DrawContours(result, contours, contur, new Scalar(hierarchy[contur].Parent < 255 ? 255 : 20 * contur), -1,
hierarchy: hierarchy,
maxLevel: int.MaxValue);
return result;
}
/// <summary>
/// <para>
/// Ссылка на обсуждение нахождения расстояний
/// <see href="https://stackoverflow.com/questions/26421566/pixel-indexing-in-opencvs-distance-transform">вот</see> и на форум из комментариев
/// <see href="https://answers.opencv.org/question/6109/per-pixel-labeling-in-distancetransform/">ещё вот</see>. Там на C++
/// </para>
/// <para>
/// Вот ещё <see href="https://docs.opencv.org/3.4/d2/dbd/tutorial_distance_transform.html">что-то</see> с DataTransform.
/// </para>
/// <para>
/// И ещё, но <see href="https://www.reddit.com/r/computervision/comments/cj7kqq/any_algorithms_for_finding_closest_two_black/">что-то</see> не читал.
/// </para>
/// <para>
/// <see href="https://www.appsloveworld.com/opencv/100/6/pixel-indexing-in-opencvs-distance-transform">Это</see>, к сожалению, на Питоне,
/// и там используется местная библиотека numpy, так что не подходит.
/// </para>
/// <para>
/// Вот <see href="https://python.hotexamples.com/ru/examples/cv2/-/distanceTransformWithLabels/python-distancetransformwithlabels-function-examples.html">тут</see>
/// примеры функций типа bwdist и прочих. До конца не смотрел, возможно, что-то и подходит.К сожалению, тоже на Питоне, и также используется numpy.
/// </para>
/// <para>
/// <see href="https://shimat.github.io/opencvsharp_docs/html/f61ce7b7-e1a6-119d-9a73-3d60751e88de.htm">Это</see>
/// просто документация, описание DistanceTransformWithLabels. К сожалению, написано очень скудно, и примеров нет.
/// </para>
/// <para>
/// Вот <see href="https://csharpdoc.hotexamples.com/class/OpenCvSharp/Cv2">тут</see>
/// примеры функций, но похоже, просто скопировано с докементации, примеров, к сожалению, нет (ну они есть, но <see href="https://csharp.hotexamples.com/examples/OpenCvSharp/Cv2/-/php-cv2-class-examples.html">не те</see>).
/// </para>
/// </summary>
/// <param name="input"></param>
/// <param name="contur"></param>
private static void DistanceTransform(Mat input, int contur)
{
var distanceTransform = input.EmptyClone();
//Cv2.DistanceTransform(dst1, dst2, DistanceTypes.L2, DistanceTransformMasks.Precise);
var labels = input.EmptyClone();
Cv2.DistanceTransformWithLabels(input, distanceTransform, labels, DistanceTypes.L2, DistanceTransformMasks.Precise,
//Cv2.DistanceTransformWithLabels(dst1, dst2, labelIndexes, DistanceTypes.L2, DistanceTransformMasks.Mask3,
DistanceTransformLabelTypes.Pixel);
distanceTransform.SaveImage(@$"F:\GS_TEST_ccc{contur}.png");
//labels.PushBack(-1);
var k = 1;
for (int i = 0; i < distanceTransform.Height; i++)
{
for (int j = 0; j < distanceTransform.Width; j++)
{
var px = distanceTransform.At<int>(i, j);
if (px == 0)
{
//labels.PushBack(new Vec2i(i, j));
}
else { }
var p = labels.At<int>(i, j);
var p_x = p % labels.Width;
var p_y = p / labels.Width;
var p1 = labels.At<Vec2i>(i, j);
var p2 = labels.At<Vec3i>(i, j);
var p3 = labels.At<Point2d>(i, j);
var p4 = labels.At<Point>(i, j);
}
}
labels.SaveImage(@$"F:\GS_TEST_cccc{contur}.png");
}
//private void B()
//{
// using (var s = new FileStream(filePath, FileMode.Open, FileAccess.Read))
// {
// //var m = new Mat();
// //var m = Mat.FromStream(s, ImreadModes.Color);
// var m = Mat.FromStream(s, ImreadModes.Grayscale);
// var result = new List<ushort>();
// var nonZero = m.FindNonZero();
// var colors = new List<ushort>();
// var total = nonZero.Total();
// for (int i = 0; i < total; i++)
// {
// var p = nonZero.At<Point>(i);
// var color = m.At<byte>(p.X, p.Y);
// if (!colors.Contains(color) && color != 0) colors.Add(color);
// }
// //___
// //var c = m.InRange(new Scalar(color), new Scalar(color));
// var c = m.Threshold(0, 255, ThresholdTypes.Binary & ThresholdTypes.Otsu);
// var closing = c.EmptyClone();
// //var contours0 = closing.FindContoursAsMat(RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// //Cv2.MorphologyEx(c, closing, MorphTypes.Close, contours0[0]);
// Cv2.MorphologyEx(c, closing, MorphTypes.Close, null);
// //var contours0 = closing.FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);
// Point[][] contours1;
// HierarchyIndex[] hierarchy;
// //closing.FindContours(out contours1, , RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// closing.FindContours(out contours1, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// var contNum = 0;
// var aaaaa = contours1.Count();
// var aaa = hierarchy.Where(q => q.Parent < 0).ToList();
// //var boundingRect = Cv2.BoundingRect(contours1[0]);
// var dst0 = Mat.Zeros(m.Size(), MatType.CV_8UC3).ToMat();
// //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// //Cv2.DrawContours(dst0, contours1, contNum, new Scalar(0, 128, 20 * contNum), -1,
// // LineTypes.Link8, maxLevel: -1);
// //Cv2.DrawContours(dst0, contours1, 0, new Scalar(hierarchy[contNum].Parent < 0 ? 255 : 0, 128, 20 * contNum), -1, maxLevel: -1);
// //Cv2.DrawContours(dst0, contours1, 0, new Scalar(hierarchy[contNum].Parent < 0 ? 255 : 0, 128, 20 * contNum), -1, maxLevel: int.MaxValue);
// Cv2.DrawContours(dst0, contours1, contNum, new Scalar(hierarchy[contNum].Parent < 0 ? 255 : 0, 128, 20 * contNum), -1,
// hierarchy: hierarchy,
// //maxLevel: -1);
// maxLevel: int.MaxValue);
// //colorSeparatedMats.Add(c);
// dst0.SaveImage(@$"F:\GS_TEST_c{contNum}.png");
// var boundingRect = Cv2.BoundingRect(contours1[0]);
// //var dst1 = Mat.Zeros(boundingRect.Size, MatType.CV_8UC1).ToMat();
// var dst1 = Mat.Zeros(m.Size(), MatType.CV_8UC1).ToMat();
// //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// //Cv2.DrawContours(dst1, contours1, contNum, new Scalar(hierarchy[contNum].Parent < 0 ? 255 : 0, 128, 20 * contNum), -1,
// Cv2.DrawContours(dst1, contours1, contNum, new Scalar(hierarchy[contNum].Parent < 255 ? 255 : 20 * contNum), -1,
// hierarchy: hierarchy,
// //maxLevel: -1);
// maxLevel: int.MaxValue);
// //colorSeparatedMats.Add(c);
// dst1.SaveImage(@$"F:\GS_TEST_cc{contNum}.png");
// var dst2 = dst1.EmptyClone();
// //Cv2.DistanceTransform(dst1, dst2, DistanceTypes.L2, DistanceTransformMasks.Precise);
// var labels = dst1.EmptyClone();
// Cv2.DistanceTransformWithLabels(dst1, dst2, labels, DistanceTypes.L2, DistanceTransformMasks.Precise,
// //Cv2.DistanceTransformWithLabels(dst1, dst2, labelIndexes, DistanceTypes.L2, DistanceTransformMasks.Mask3,
// DistanceTransformLabelTypes.Pixel);
// dst2.SaveImage(@$"F:\GS_TEST_ccc{contNum}.png");
// //labels.PushBack(-1);
// var k = 1;
// for (int i = 0; i < dst2.Height; i++)
// //for (int i = boundingRect.Top; i < boundingRect.Height; i++)
// {
// for (int j = 0; j < dst2.Width; j++)
// //for (int j = boundingRect.Left; j < boundingRect.Width; j++)
// {
// var px = dst2.At<int>(i, j);
// if (px == 0)
// {
// //labels.PushBack(new Vec2i(i, j));
// }
// else { }
// var p = labels.At<int>(i, j);
// var p_x = p % labels.Width;
// var p_y = p / labels.Width;
// var p1 = labels.At<Vec2i>(i, j);
// var p2 = labels.At<Vec3i>(i, j);
// var p3 = labels.At<Point2d>(i, j);
// var p4 = labels.At<Point>(i, j);
// }
// }
// labels.SaveImage(@$"F:\GS_TEST_cccc{contNum}.png");
// //var un = labels.dis
// Console.ReadLine();
// //foreach (var contour in contours1)
// //{
// // //if (hierarchy[contNum].Parent < 0)
// // //{
// // // var boundingRect = Cv2.BoundingRect(contour);
// // // var dst0 = Mat.Zeros(m.Size(), MatType.CV_8UC3).ToMat();
// // // //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // // Cv2.DrawContours(dst0, contours1, contNum, new Scalar(0, color, 20 * cNum), -1,
// // // LineTypes.Link8, maxLevel: -1);
// // // //colorSeparatedMats.Add(c);
// // // dst0.SaveImage(@$"F:\GS_TEST_c{cNum}.png");
// // //}
// // var boundingRect = Cv2.BoundingRect(contour);
// // var dst0 = Mat.Zeros(m.Size(), MatType.CV_8UC3).ToMat();
// // //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // //Cv2.DrawContours(dst0, contours1, contNum, new Scalar(0, 128, 20 * contNum), -1,
// // // LineTypes.Link8, maxLevel: -1);
// // Cv2.DrawContours(dst0, contours1, contNum, new Scalar(hierarchy[contNum].Parent < 0 ? 255 : 0, 128, 20 * contNum), -1,
// // LineTypes.Link8, maxLevel: -1);
// // //colorSeparatedMats.Add(c);
// // dst0.SaveImage(@$"F:\GS_TEST_c{contNum}.png");
// // //var mean = Cv2.Mean(c, mask);
// // //var notBlackContour = Cv2.Mean(c, mask)[0] > 0;
// // //var averageInsideColor =
// // //var c1 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // //var dst0 = c1.EmptyClone();
// // //Cv2.BitwiseAnd(c1, c1, dst0, c.GetRectSubPix(boundingRect.Size, new Point2f(boundingRect.Left + (boundingRect.Width / 2), boundingRect.Top + (boundingRect.Height / 2))));
// // //var c1 = c.CvtColor(ColorConversionCodes.GRAY2BGR);
// // //var m1 = c1.InRange(new Scalar(0), new Scalar(255));
// // //Cv2.FloodFill(c1, m1, new Point(0, 0), new Scalar(0, color, 20 * cNum));
// // //dst0.SaveImage(@$"F:\GS_TEST_cc{cNum}_{contNum}.png");
// // contNum++;
// //}
// //___
// //var colorSeparatedMats = new List<Mat>();
// //var cNum = 0;
// //foreach (var color in colors)
// //{
// // //var c = m.InRange(new Scalar(color), new Scalar(color));
// // var c = m.Threshold(0, 255, ThresholdTypes.Binary & ThresholdTypes.Otsu);
// // var closing = c.EmptyClone();
// // //var contours0 = closing.FindContoursAsMat(RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// // //Cv2.MorphologyEx(c, closing, MorphTypes.Close, contours0[0]);
// // Cv2.MorphologyEx(c, closing, MorphTypes.Close, null);
// // //var contours0 = closing.FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);
// // Point[][] contours1;
// // HierarchyIndex[] hierarchy;
// // //closing.FindContours(out contours1, , RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// // closing.FindContours(out contours1, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// // var contNum = 0;
// // var aaaaa = contours1.Count();
// // var a01 = hierarchy[0].Previous;
// // var a02 = hierarchy[0].Next;
// // var a03 = hierarchy[1].Previous;
// // var a04 = hierarchy[1].Next;
// // var aaa = hierarchy.Where(q => q.Parent < 0).ToList();
// // foreach (var contour in contours1)
// // {
// // //if (hierarchy[contNum].Parent < 0)
// // //{
// // // var boundingRect = Cv2.BoundingRect(contour);
// // // var dst0 = Mat.Zeros(m.Size(), MatType.CV_8UC3).ToMat();
// // // //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // // Cv2.DrawContours(dst0, contours1, contNum, new Scalar(0, color, 20 * cNum), -1,
// // // LineTypes.Link8, maxLevel: -1);
// // // //colorSeparatedMats.Add(c);
// // // dst0.SaveImage(@$"F:\GS_TEST_c{cNum}.png");
// // //}
// // var boundingRect = Cv2.BoundingRect(contour);
// // var dst0 = Mat.Zeros(m.Size(), MatType.CV_8UC3).ToMat();
// // //var dst0 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // Cv2.DrawContours(dst0, contours1, contNum, new Scalar(0, color, 20 * cNum), -1,
// // LineTypes.Link8, maxLevel: -1);
// // //colorSeparatedMats.Add(c);
// // dst0.SaveImage(@$"F:\GS_TEST_c{cNum}.png");
// // //var mean = Cv2.Mean(c, mask);
// // //var notBlackContour = Cv2.Mean(c, mask)[0] > 0;
// // //var averageInsideColor =
// // //var c1 = new Mat(boundingRect.Size, MatType.CV_8UC3, new Scalar(0, color, 20 * cNum));
// // //var dst0 = c1.EmptyClone();
// // //Cv2.BitwiseAnd(c1, c1, dst0, c.GetRectSubPix(boundingRect.Size, new Point2f(boundingRect.Left + (boundingRect.Width / 2), boundingRect.Top + (boundingRect.Height / 2))));
// // //var c1 = c.CvtColor(ColorConversionCodes.GRAY2BGR);
// // //var m1 = c1.InRange(new Scalar(0), new Scalar(255));
// // //Cv2.FloodFill(c1, m1, new Point(0, 0), new Scalar(0, color, 20 * cNum));
// // //dst0.SaveImage(@$"F:\GS_TEST_cc{cNum}_{contNum}.png");
// // contNum++;
// // }
// // //colorSeparatedMats.Add(c);
// // //c.SaveImage(@$"F:\GS_TEST_c{cNum}.png");
// // cNum++;
// //}
// //foreach (var cMat in colorSeparatedMats)
// //{
// // cNum++;
// //}
// //c.SaveImage(@$"F:\GS_TEST_c{cNum}.png");
// var contours = m.FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);
// var a = contours.Count();
// //var c = contours.Where(q => q.).Count();
// //var nbl = m.FindNonZero();
// //var contours1 = nbl.FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxNone);
// //var b = contours1.Count();
// var biggestContourRect = Cv2.BoundingRect(contours[0]);
// Mat dst = new Mat();
// Cv2.Rectangle(dst,
// new Point(biggestContourRect.X, biggestContourRect.Y),
// new Point(biggestContourRect.X + biggestContourRect.Width, biggestContourRect.Y + biggestContourRect.Height),
// new Scalar(255, 255, 255), 2);
// }
//}
}
}