opencv 4.10

This commit is contained in:
EugeneTes
2026-03-24 11:57:27 +01:00
parent 34b74ecdcd
commit a1838cafeb
26 changed files with 231 additions and 34 deletions

View File

@@ -105,11 +105,13 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye
var pointer = pinnedArray.AddrOfPinnedObject(); var pointer = pinnedArray.AddrOfPinnedObject();
Mat image = new Mat(_cameraSettings.ImageSettings.Lines, _cameraSettings.ImageSettings.SensorWidth,
Mat image = Mat.FromPixelData(_cameraSettings.ImageSettings.Lines, _cameraSettings.ImageSettings.SensorWidth,
MatType.CV_8UC1, pointer); MatType.CV_8UC1, pointer);
var xCrop = _cameraSettings.ImageSettings.SensorWidth - _cameraSettings.ImageWidth - var xCrop = _cameraSettings.ImageSettings.SensorWidth - _cameraSettings.ImageWidth -
_cameraSettings.OffsetX; _cameraSettings.OffsetX;

View File

@@ -100,9 +100,9 @@ public class OpenCVBayerProcessor
Mat greenCorrected = new Mat(); Mat greenCorrected = new Mat();
Mat redCorrected = new Mat(); Mat redCorrected = new Mat();
Mat blueLutMat = new Mat(1, 256, MatType.CV_8U, blueLut); Mat blueLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, blueLut);
Mat greenLutMat = new Mat(1, 256, MatType.CV_8U, greenLut); Mat greenLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, greenLut);
Mat redLutMat = new Mat(1, 256, MatType.CV_8U, redLut); Mat redLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, redLut);
Cv2.LUT(channels[0], blueLutMat, blueCorrected); Cv2.LUT(channels[0], blueLutMat, blueCorrected);
Cv2.LUT(channels[1], greenLutMat, greenCorrected); Cv2.LUT(channels[1], greenLutMat, greenCorrected);

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,143 @@
using OpenCvSharp;
using System.Diagnostics;
using System.Threading.Channels;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.Processing;
namespace Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera
{
public class LibcameraImageSource : IImageSource, IVisionBuilderModule
{
public async Task<Mat> GetImage(CancellationToken token)
{
return await _imageChannel.Reader.ReadAsync(token);
}
public void InitializeModule()
{
Start();
}
byte[] JpegHeader = new byte[] { 0xff, 0xd8 };
byte[] JpegFooter = new byte[] { 0xff, 0xd9 };
int ChunkSize = 1024;
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "libcamera-vid",
Arguments = "--codec mjpeg -t0 --width 2028 --height 1520 --shutter 10000 --framerate 16 --awbgains 3.86,1.46 --nopreview -o -",
RedirectStandardOutput = true,
UseShellExecute = false
};
Channel<Mat> _imageChannel = Channel.CreateBounded<Mat>(new BoundedChannelOptions(1) { FullMode = BoundedChannelFullMode.DropOldest });
public void Start()
{
Thread th = new Thread(StartLoop);
th.IsBackground = true;
th.Start();
}
private void StartLoop()
{
using (Process process = Process.Start(psi))
using (BinaryReader br = new BinaryReader(process.StandardOutput.BaseStream))
{
byte[] imageBuffer = new byte[1024 * 1024];
// decode MJPEG buffer
var buff = br.ReadBytes(ChunkSize);
int frameId = 0;
while (true)
{
var imageStart = Find(buff, JpegHeader);
if (imageStart != -1)
{
var size = buff.Length - imageStart;
Array.Copy(buff, imageStart, imageBuffer, 0, size);
while (true)
{
buff = br.ReadBytes(ChunkSize);
var imageEnd = Find(buff, JpegFooter);
if (imageEnd != -1)
{
var frame = new byte[size + imageEnd];
Array.Copy(imageBuffer, frame, size);
Array.Copy(buff, 0, frame, size, imageEnd);
// process frame
frameId++;
var decoded = Mat.ImDecode(frame);
_imageChannel.Writer.WriteAsync(decoded, CancellationToken.None);
// copy the leftover data to the start
Array.Copy(buff, imageEnd, buff, 0, buff.Length - imageEnd);
// fill the remainder of the buffer with new data and start over
var temp = br.ReadBytes(imageEnd);
Array.Copy(temp, 0, buff, buff.Length - imageEnd, temp.Length);
break;
}
// copy all of the data to the imageBuffer
Array.Copy(buff, 0, imageBuffer, size, buff.Length);
size += buff.Length;
}
}
else
{
Console.WriteLine("JPEG header not found.");
break;
}
}
process.Kill();
}
}
public static int Find(byte[] buff, byte[] search)
{
// enumerate the buffer but don't overstep the bounds
for (int start = 0; start < buff.Length - search.Length; start++)
{
// we found the first character
if (buff[start] == search[0])
{
int next;
// traverse the rest of the bytes
for (next = 1; next < search.Length; next++)
{
// if we don't match, bail
if (buff[start + next] != search[next])
break;
}
if (next == search.Length)
return start;
}
}
// not found
return -1;
}
public async Task<Mat> GetImageAsync(CancellationToken cancellationToken)
{
return await _imageChannel.Reader.ReadAsync(cancellationToken);
}
}
}

View File

@@ -31,8 +31,8 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="OpenCvSharp4" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
</ItemGroup> </ItemGroup>

View File

@@ -93,7 +93,8 @@ public class AnomalyAI: BaseOperation
// black and white mask // black and white mask
var mask = new Mat(30, 48, MatType.CV_8UC1, resultColor); var mask = new Mat(30, 48, MatType.CV_8UC1);
mask.SetArray(resultColor);
var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height)); var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height));

View File

@@ -60,7 +60,8 @@ public class BackgroundSeparationModelOperation:BaseOperation,IHaveOrigin
var bytes= MatToBytes(img); var bytes= MatToBytes(img);
var responseBytes = _transfer.TransferData(ModelName, 3, bytes); var responseBytes = _transfer.TransferData(ModelName, 3, bytes);
var response = new Mat(img.Rows, img.Cols, MatType.CV_8UC1, responseBytes); var response = new Mat(img.Rows, img.Cols, MatType.CV_8UC1);
response.SetArray(responseBytes);
var contours = response.Threshold(128, 255, ThresholdTypes.Binary).FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxSimple); var contours = response.Threshold(128, 255, ThresholdTypes.Binary).FindContoursAsArray(RetrievalModes.List, ContourApproximationModes.ApproxSimple);

View File

@@ -78,7 +78,8 @@ public class Color128HalfOperation:BaseOperation
.ToArray(); .ToArray();
// black and white mask // black and white mask
var mask = new Mat(_imageHeight, _imageWidth, MatType.CV_8UC1, resultColor); var mask = new Mat(_imageHeight, _imageWidth, MatType.CV_8UC1);
mask.SetArray(resultColor);
var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height)); var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height));

View File

@@ -111,7 +111,8 @@ public abstract class ColorAIOperation:BaseOperation
// black and white mask // black and white mask
var mask = new Mat(_imageHeight, _imageWidth, MatType.CV_8UC1, resultColor); var mask = new Mat(_imageHeight, _imageWidth, MatType.CV_8UC1);
mask.SetArray(resultColor);
var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height)); var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height));

View File

@@ -129,7 +129,8 @@ public class ModelAIOperation: BaseOperation
// black and white mask // black and white mask
var mask = new Mat(outputSizeArray[0], outputSizeArray[1], MatType.CV_8UC1, resultColor); var mask = new Mat(outputSizeArray[0], outputSizeArray[1], MatType.CV_8UC1);
mask.SetArray(resultColor);
var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height)); var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height));

View File

@@ -105,7 +105,8 @@ public class RawModelAIOperation: BaseOperation
var outputSizeArray = outputSize.Select(Convert.ToInt32).ToArray(); var outputSizeArray = outputSize.Select(Convert.ToInt32).ToArray();
var mask = new Mat(outputSizeArray[0], outputSizeArray[1], MatType.CV_8UC1, resultColor); var mask = new Mat(outputSizeArray[0], outputSizeArray[1], MatType.CV_8UC1);
mask.SetArray(resultColor);
var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height)); var maskResized = mask.Resize(new Size(currentImage.ImageData.Width, currentImage.ImageData.Height));

View File

@@ -13,7 +13,7 @@ public class SkeletonOperation:BaseOperation
if(!CheckGrayscale(context)) return; if(!CheckGrayscale(context)) return;
var skeleton = new Mat(context.ActiveImage.ImageData.Size(), MatType.CV_8UC1, 0); var skeleton = new Mat(context.ActiveImage.ImageData.Size(), MatType.CV_8UC1, Scalar.All(0));
var temp = context.ActiveImage.ImageData.Clone(); var temp = context.ActiveImage.ImageData.Clone();
var element = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(3, 3)); var element = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(3, 3));
var image = context.ActiveImage.ImageData.Clone(); var image = context.ActiveImage.ImageData.Clone();

View File

@@ -49,13 +49,13 @@ public class GaborFilterOperation : BaseOperation
} }
var image = context.ActiveImage.ImageData; var image = context.ActiveImage.ImageData;
var newimage = new Mat(image.Size(), image.Type(), 0); var newimage = new Mat(image.Size(), image.Type(), Scalar.All(0));
foreach (double theta in steps) foreach (double theta in steps)
{ {
var kernel = Cv2.GetGaborKernel(new Size(KSize, KSize), Sigma, theta, Lambda, Gamma, 0, MatType.CV_64F); var kernel = Cv2.GetGaborKernel(new Size(KSize, KSize), Sigma, theta, Lambda, Gamma, 0, MatType.CV_64F);
kernel /= 1 * kernel.Sum().Val0; kernel /= 1 * kernel.Sum().Val0;
var filtered = new Mat(image.Size(), image.Type(), 0); var filtered = new Mat(image.Size(), image.Type(), Scalar.All(0));
Cv2.Filter2D(image, filtered, -1, kernel); Cv2.Filter2D(image, filtered, -1, kernel);
Cv2.Max(newimage, filtered, newimage); Cv2.Max(newimage, filtered, newimage);
} }

View File

@@ -21,7 +21,7 @@ public class ImageSizeProportionOperation:BaseOperation
context.ActiveImage = new HawkeyeImage() context.ActiveImage = new HawkeyeImage()
{ {
ImageData = context.ActiveImage!.ImageData.Resize(Size.Zero, Width, Height) ImageData = context.ActiveImage!.ImageData.Resize(new Size(0,0), Width, Height)
}; };
Status = $"Image resized to {context.ActiveImage.ImageData.Width}x{context.ActiveImage.ImageData.Height}"; Status = $"Image resized to {context.ActiveImage.ImageData.Width}x{context.ActiveImage.ImageData.Height}";

View File

@@ -18,7 +18,7 @@ public class InvertOperation:BaseOperation
if (!CheckImageExists(context)) return; if (!CheckImageExists(context)) return;
var res = new Mat(context.ActiveImage.ImageData.Size(), context.ActiveImage.ImageData.Type(), 0); var res = new Mat(context.ActiveImage.ImageData.Size(), context.ActiveImage.ImageData.Type(), Scalar.All(0));
Cv2.BitwiseNot(context.ActiveImage.ImageData, res); Cv2.BitwiseNot(context.ActiveImage.ImageData, res);
context.ActiveImage = new HawkeyeImage() context.ActiveImage = new HawkeyeImage()
{ {

View File

@@ -31,7 +31,7 @@ public class TakeBiggestOperation : BaseOperation
var largestContour = contours.OrderByDescending(c => Cv2.ContourArea(c)).First(); var largestContour = contours.OrderByDescending(c => Cv2.ContourArea(c)).First();
var mask = Mat.Zeros(image.Size(), MatType.CV_8UC1).ToMat(); var mask = Mat.Zeros(image.Size(), MatType.CV_8UC1).ToMat();
Cv2.DrawContours(mask, new[] {largestContour}, -1, 255, -1); Cv2.DrawContours(mask, new[] {largestContour}, -1, Scalar.All(255), -1);
context.ActiveImage = new HawkeyeImage() context.ActiveImage = new HawkeyeImage()
{ {

View File

@@ -17,7 +17,7 @@ public class DistanceTransformOperation:BaseOperation
Cv2.MinMaxLoc(distance, out double minVal, out var maxVal); Cv2.MinMaxLoc(distance, out double minVal, out var maxVal);
// clamp the distance transform to 0-255 // clamp the distance transform to 0-255
Cv2.Normalize(distance, res, 0, maxVal, NormTypes.MinMax, MatType.CV_8UC1); Cv2.Normalize(distance, res, 0, maxVal, NormTypes.MinMax, (int)MatType.CV_8UC1);

View File

@@ -16,9 +16,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoCompleteMenu-ScintillaNET" Version="2.1.0" /> <PackageReference Include="AutoCompleteMenu-ScintillaNET" Version="2.1.0" />
<PackageReference Include="MathNet.Numerics" Version="5.0.0" /> <PackageReference Include="MathNet.Numerics" Version="5.0.0" />
<PackageReference Include="OpenCvSharp4" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
<PackageReference Include="Scintilla.NET" Version="5.3.2.7" /> <PackageReference Include="Scintilla.NET" Version="5.3.2.7" />
<PackageReference Include="WindowsAPICodePack" Version="8.0.6" /> <PackageReference Include="WindowsAPICodePack" Version="8.0.6" />
</ItemGroup> </ItemGroup>

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
@@ -16,13 +16,12 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="MudBlazor" Version="8.0.0" /> <PackageReference Include="MudBlazor" Version="8.0.0" />
<PackageReference Include="Ninject.Extensions.ChildKernel" Version="3.3.0" /> <PackageReference Include="Ninject.Extensions.ChildKernel" Version="3.3.0" />
<PackageReference Include="OpenCvSharp4.runtime.linux-arm" Version="4.13.0.20260318" /> <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.6.0.20220608" /> <PackageReference Include="swety.OpenCvSharp4.runtime.linux-arm64" Version="4.10.0.20241108" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\framework\Inspectron.Settings\Inspectron.Settings.csproj" /> <ProjectReference Include="..\framework\Inspectron.Settings\Inspectron.Settings.csproj" />
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Emulation\Hawkeye.VisionBuilder.UI.Sources.Emulation.csproj" />
<ProjectReference Include="..\VisionBuilder.UI.Camera\VisionBuilder.UI.Camera.csproj" /> <ProjectReference Include="..\VisionBuilder.UI.Camera\VisionBuilder.UI.Camera.csproj" />
<ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" /> <ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" />
<ProjectReference Include="..\VisionBuilder.UI.Console\VisionBuilder.UI.Console.csproj" /> <ProjectReference Include="..\VisionBuilder.UI.Console\VisionBuilder.UI.Console.csproj" />

View File

@@ -0,0 +1,13 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "10.0.5",
"commands": [
"dotnet-ef"
],
"rollForward": false
}
}
}

View File

@@ -8,7 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="MudBlazor" Version="8.0.0" /> <PackageReference Include="MudBlazor" Version="8.0.0" />
<PackageReference Include="OpenCvSharp4" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,5 +1,6 @@
using Hawkeye.VisionBuilder.UI.Sources.Emulation; using Hawkeye.VisionBuilder.UI.Sources.Emulation;
using Hawkeye.VisionBuilder.UI.Sources.Hawkeye; using Hawkeye.VisionBuilder.UI.Sources.Hawkeye;
using Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera;
using Inspectron.Camera.UEye; using Inspectron.Camera.UEye;
using Ninject; using Ninject;
using Ninject.Extensions.ChildKernel; using Ninject.Extensions.ChildKernel;
@@ -33,6 +34,9 @@ public static class ModuleExtensions
case CameraSettings.EImageSource.IDS: case CameraSettings.EImageSource.IDS:
kernel.Bind<IImageSource, IVisionBuilderModule>().To<IDSImageSource>().InSingletonScope(); kernel.Bind<IImageSource, IVisionBuilderModule>().To<IDSImageSource>().InSingletonScope();
break; break;
case CameraSettings.EImageSource.Libcamera:
kernel.Bind<IImageSource, IVisionBuilderModule>().To<LibcameraImageSource>().InSingletonScope();
break;
case CameraSettings.EImageSource.Basler: case CameraSettings.EImageSource.Basler:
break; break;
default: default:

View File

@@ -10,6 +10,7 @@
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Emulation\Hawkeye.VisionBuilder.UI.Sources.Emulation.csproj" /> <ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Emulation\Hawkeye.VisionBuilder.UI.Sources.Emulation.csproj" />
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Hawkeye\Hawkeye.VisionBuilder.UI.Sources.Hawkeye.csproj" /> <ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Hawkeye\Hawkeye.VisionBuilder.UI.Sources.Hawkeye.csproj" />
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.IDS\Hawkeye.VisionBuilder.UI.Sources.IDS.csproj" /> <ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.IDS\Hawkeye.VisionBuilder.UI.Sources.IDS.csproj" />
<ProjectReference Include="..\Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera\Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera.csproj" />
<ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" /> <ProjectReference Include="..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -17,6 +17,7 @@ public class CameraSettings : ISettings
Hawkeye, Hawkeye,
IDS, IDS,
Basler, Basler,
Libcamera
} }

View File

@@ -10,7 +10,7 @@
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Ninject" Version="3.3.6" /> <PackageReference Include="Ninject" Version="3.3.6" />
<PackageReference Include="Ninject.Extensions.ChildKernel" Version="3.3.0" /> <PackageReference Include="Ninject.Extensions.ChildKernel" Version="3.3.0" />
<PackageReference Include="OpenCvSharp4" Version="4.6.0.20220608" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
</ItemGroup> </ItemGroup>

View File

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 18
VisualStudioVersion = 17.13.35931.197 VisualStudioVersion = 18.3.11520.95 d18.3
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Common", "VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj", "{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Common", "VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj", "{5AFF312A-EF5F-49ED-BF54-5AC69F7BEC03}"
EndProject EndProject
@@ -106,6 +106,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor", "
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor.Uno", "VisionBuilder.UI.Blazor.Uno\VisionBuilder.UI.Blazor.Uno.csproj", "{9AE35B63-607E-4009-9FE6-3DF2CD98071F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor.Uno", "VisionBuilder.UI.Blazor.Uno\VisionBuilder.UI.Blazor.Uno.csproj", "{9AE35B63-607E-4009-9FE6-3DF2CD98071F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera", "Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera\Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera.csproj", "{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -570,6 +572,18 @@ Global
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x64.Build.0 = Release|Any CPU {9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x64.Build.0 = Release|Any CPU
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.ActiveCfg = Release|Any CPU {9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.ActiveCfg = Release|Any CPU
{9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.Build.0 = Release|Any CPU {9AE35B63-607E-4009-9FE6-3DF2CD98071F}.Release|x86.Build.0 = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|x64.ActiveCfg = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|x64.Build.0 = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|x86.ActiveCfg = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Debug|x86.Build.0 = Debug|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|Any CPU.Build.0 = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|x64.ActiveCfg = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|x64.Build.0 = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|x86.ActiveCfg = Release|Any CPU
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -608,6 +622,7 @@ Global
{AD3BC36E-8FC9-4A13-AD6B-606325AFF291} = {F3414823-B70E-435E-B4EA-80ABF4371449} {AD3BC36E-8FC9-4A13-AD6B-606325AFF291} = {F3414823-B70E-435E-B4EA-80ABF4371449}
{0C14CF80-D743-4809-9B9C-2A096FEA2E06} = {FA674B5A-3394-926C-2B1E-70E5B00E4A5C} {0C14CF80-D743-4809-9B9C-2A096FEA2E06} = {FA674B5A-3394-926C-2B1E-70E5B00E4A5C}
{9AE35B63-607E-4009-9FE6-3DF2CD98071F} = {F3414823-B70E-435E-B4EA-80ABF4371449} {9AE35B63-607E-4009-9FE6-3DF2CD98071F} = {F3414823-B70E-435E-B4EA-80ABF4371449}
{FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE} = {D05689E3-04C6-4E3B-ACA7-3F4507CED4CC}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3CE42AE5-D79F-4E97-A246-AA8FD228B677} SolutionGuid = {3CE42AE5-D79F-4E97-A246-AA8FD228B677}