Dodaj pliki projektów.
This commit is contained in:
parent
0a5bd4d55b
commit
7f28de2ce3
8
Domain/Abstractions/ILayer.cs
Normal file
8
Domain/Abstractions/ILayer.cs
Normal 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
9
Domain/Domain.csproj
Normal 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
17
Domain/OpticalSchema.cs
Normal 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
31
Make3.Renderer.sln
Normal 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
|
||||||
26
Make3.Renderer/Layers/LayerBase.cs
Normal file
26
Make3.Renderer/Layers/LayerBase.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
45
Make3.Renderer/Layers/TrekoLayers/Treko.cs
Normal file
45
Make3.Renderer/Layers/TrekoLayers/Treko.cs
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
17
Make3.Renderer/Layers/TrekoLayers/Treko3d.cs
Normal file
17
Make3.Renderer/Layers/TrekoLayers/Treko3d.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
Make3.Renderer/Make3.Renderer.csproj
Normal file
19
Make3.Renderer/Make3.Renderer.csproj
Normal 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
44
Make3.Renderer/Program.cs
Normal 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
422
Make3.Renderer/TestClass.cs
Normal 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);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user