diff --git a/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/HawkeyeCameraImageSource.cs b/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/HawkeyeCameraImageSource.cs index f008a15..6830588 100644 --- a/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/HawkeyeCameraImageSource.cs +++ b/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/HawkeyeCameraImageSource.cs @@ -105,11 +105,13 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye 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); - - + + + var xCrop = _cameraSettings.ImageSettings.SensorWidth - _cameraSettings.ImageWidth - _cameraSettings.OffsetX; diff --git a/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/OpenCVBayerFilter.cs b/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/OpenCVBayerFilter.cs index c4453b3..1f9074a 100644 --- a/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/OpenCVBayerFilter.cs +++ b/Hawkeye.VisionBuilder.UI.Sources.Hawkeye/OpenCVBayerFilter.cs @@ -100,9 +100,9 @@ public class OpenCVBayerProcessor Mat greenCorrected = new Mat(); Mat redCorrected = new Mat(); - Mat blueLutMat = new Mat(1, 256, MatType.CV_8U, blueLut); - Mat greenLutMat = new Mat(1, 256, MatType.CV_8U, greenLut); - Mat redLutMat = new Mat(1, 256, MatType.CV_8U, redLut); + Mat blueLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, blueLut); + Mat greenLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, greenLut); + Mat redLutMat = Mat.FromPixelData(1, 256, MatType.CV_8U, redLut); Cv2.LUT(channels[0], blueLutMat, blueCorrected); Cv2.LUT(channels[1], greenLutMat, greenCorrected); diff --git a/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera.csproj b/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera.csproj new file mode 100644 index 0000000..d475293 --- /dev/null +++ b/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/LibcameraImageSource.cs b/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/LibcameraImageSource.cs new file mode 100644 index 0000000..e046a8d --- /dev/null +++ b/Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera/LibcameraImageSource.cs @@ -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 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 _imageChannel = Channel.CreateBounded(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 GetImageAsync(CancellationToken cancellationToken) + { + return await _imageChannel.Reader.ReadAsync(cancellationToken); + + } + + } +} diff --git a/Hawkeye.VisionBuilder.Workflow/Hawkeye.VisionBuilder.Workflow.csproj b/Hawkeye.VisionBuilder.Workflow/Hawkeye.VisionBuilder.Workflow.csproj index b28da0c..a1bca54 100644 --- a/Hawkeye.VisionBuilder.Workflow/Hawkeye.VisionBuilder.Workflow.csproj +++ b/Hawkeye.VisionBuilder.Workflow/Hawkeye.VisionBuilder.Workflow.csproj @@ -31,8 +31,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/AnomalyAI.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/AnomalyAI.cs index 68fc5b4..620699a 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/AnomalyAI.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/AnomalyAI.cs @@ -93,7 +93,8 @@ public class AnomalyAI: BaseOperation // 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)); diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/BackgroundSeparationModelOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/BackgroundSeparationModelOperation.cs index 48a6688..d7530c5 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/BackgroundSeparationModelOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/BackgroundSeparationModelOperation.cs @@ -60,7 +60,8 @@ public class BackgroundSeparationModelOperation:BaseOperation,IHaveOrigin var bytes= MatToBytes(img); 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); diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/Color128HalfOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/Color128HalfOperation.cs index da796d5..1c9cd01 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/Color128HalfOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/Color128HalfOperation.cs @@ -78,8 +78,9 @@ public class Color128HalfOperation:BaseOperation .ToArray(); // 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)); context.ActiveImage = new HawkeyeImage() {ImageData = maskResized}; diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/ColorAIOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/ColorAIOperation.cs index 67914b6..a7de878 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/ColorAIOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/ColorAIOperation.cs @@ -111,8 +111,9 @@ public abstract class ColorAIOperation:BaseOperation // 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)); context.ActiveImage = new HawkeyeImage() { ImageData = maskResized }; diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/ModelAIOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/ModelAIOperation.cs index 5001889..db9fe98 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/ModelAIOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/ModelAIOperation.cs @@ -129,7 +129,8 @@ public class ModelAIOperation: BaseOperation // 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)); diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/RawModelAIOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/RawModelAIOperation.cs index a50db77..127c465 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/RawModelAIOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/RawModelAIOperation.cs @@ -105,7 +105,8 @@ public class RawModelAIOperation: BaseOperation 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)); diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Basic/SkeletonOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Basic/SkeletonOperation.cs index 4627a3f..1fe41cc 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Basic/SkeletonOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Basic/SkeletonOperation.cs @@ -13,7 +13,7 @@ public class SkeletonOperation:BaseOperation 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 element = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(3, 3)); var image = context.ActiveImage.ImageData.Clone(); diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Filters/GaborFilterOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Filters/GaborFilterOperation.cs index 07220e2..4a23b76 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Filters/GaborFilterOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Filters/GaborFilterOperation.cs @@ -49,13 +49,13 @@ public class GaborFilterOperation : BaseOperation } 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) { var kernel = Cv2.GetGaborKernel(new Size(KSize, KSize), Sigma, theta, Lambda, Gamma, 0, MatType.CV_64F); 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.Max(newimage, filtered, newimage); } diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Image/ImageSizeProportionOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Image/ImageSizeProportionOperation.cs index e57fff1..c161226 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Image/ImageSizeProportionOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Image/ImageSizeProportionOperation.cs @@ -21,7 +21,7 @@ public class ImageSizeProportionOperation:BaseOperation 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}"; diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Image/InvertOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Image/InvertOperation.cs index 5d0affc..45f2740 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Image/InvertOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Image/InvertOperation.cs @@ -18,7 +18,7 @@ public class InvertOperation:BaseOperation 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); context.ActiveImage = new HawkeyeImage() { diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Morphology/TakeBiggestOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Morphology/TakeBiggestOperation.cs index 0073224..4ec6455 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Morphology/TakeBiggestOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Morphology/TakeBiggestOperation.cs @@ -31,7 +31,7 @@ public class TakeBiggestOperation : BaseOperation var largestContour = contours.OrderByDescending(c => Cv2.ContourArea(c)).First(); 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() { diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/Transformations/DistanceTransformOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/Transformations/DistanceTransformOperation.cs index 96f1841..8caab2b 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/Transformations/DistanceTransformOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/Transformations/DistanceTransformOperation.cs @@ -17,7 +17,7 @@ public class DistanceTransformOperation:BaseOperation Cv2.MinMaxLoc(distance, out double minVal, out var maxVal); // 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); diff --git a/Hawkeye.VisionBuilder/Hawkeye.VisionBuilder.csproj b/Hawkeye.VisionBuilder/Hawkeye.VisionBuilder.csproj index 8cc3630..c7d6902 100644 --- a/Hawkeye.VisionBuilder/Hawkeye.VisionBuilder.csproj +++ b/Hawkeye.VisionBuilder/Hawkeye.VisionBuilder.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/VisionBuilder.UI.Blazor.Uno/VisionBuilder.UI.Blazor.Uno.csproj b/VisionBuilder.UI.Blazor.Uno/VisionBuilder.UI.Blazor.Uno.csproj index a5937cd..461492d 100644 --- a/VisionBuilder.UI.Blazor.Uno/VisionBuilder.UI.Blazor.Uno.csproj +++ b/VisionBuilder.UI.Blazor.Uno/VisionBuilder.UI.Blazor.Uno.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -16,13 +16,12 @@ - - + + - diff --git a/VisionBuilder.UI.Blazor.Uno/dotnet-tools.json b/VisionBuilder.UI.Blazor.Uno/dotnet-tools.json new file mode 100644 index 0000000..b6f4c2f --- /dev/null +++ b/VisionBuilder.UI.Blazor.Uno/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "10.0.5", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj b/VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj index b9e5198..2aa1f88 100644 --- a/VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj +++ b/VisionBuilder.UI.Blazor/VisionBuilder.UI.Blazor.csproj @@ -8,7 +8,7 @@ - + diff --git a/VisionBuilder.UI.Camera/ModuleExtensions.cs b/VisionBuilder.UI.Camera/ModuleExtensions.cs index 75117f3..59e0b18 100644 --- a/VisionBuilder.UI.Camera/ModuleExtensions.cs +++ b/VisionBuilder.UI.Camera/ModuleExtensions.cs @@ -1,5 +1,6 @@ using Hawkeye.VisionBuilder.UI.Sources.Emulation; using Hawkeye.VisionBuilder.UI.Sources.Hawkeye; +using Hawkeye.VisionBuilder.UI.Sources.Raspberry.Libcamera; using Inspectron.Camera.UEye; using Ninject; using Ninject.Extensions.ChildKernel; @@ -33,6 +34,9 @@ public static class ModuleExtensions case CameraSettings.EImageSource.IDS: kernel.Bind().To().InSingletonScope(); break; + case CameraSettings.EImageSource.Libcamera: + kernel.Bind().To().InSingletonScope(); + break; case CameraSettings.EImageSource.Basler: break; default: diff --git a/VisionBuilder.UI.Camera/VisionBuilder.UI.Camera.csproj b/VisionBuilder.UI.Camera/VisionBuilder.UI.Camera.csproj index e458279..9c9c28e 100644 --- a/VisionBuilder.UI.Camera/VisionBuilder.UI.Camera.csproj +++ b/VisionBuilder.UI.Camera/VisionBuilder.UI.Camera.csproj @@ -10,6 +10,7 @@ + diff --git a/VisionBuilder.UI.Common/CameraSettings.cs b/VisionBuilder.UI.Common/CameraSettings.cs index 27eb927..898e8ea 100644 --- a/VisionBuilder.UI.Common/CameraSettings.cs +++ b/VisionBuilder.UI.Common/CameraSettings.cs @@ -17,6 +17,7 @@ public class CameraSettings : ISettings Hawkeye, IDS, Basler, + Libcamera } diff --git a/VisionBuilder.UI.Common/VisionBuilder.UI.Common.csproj b/VisionBuilder.UI.Common/VisionBuilder.UI.Common.csproj index 58a79d0..249a4e5 100644 --- a/VisionBuilder.UI.Common/VisionBuilder.UI.Common.csproj +++ b/VisionBuilder.UI.Common/VisionBuilder.UI.Common.csproj @@ -10,7 +10,7 @@ - + diff --git a/VisionBuilder.UI.sln b/VisionBuilder.UI.sln index 5ec7f93..d371fba 100644 --- a/VisionBuilder.UI.sln +++ b/VisionBuilder.UI.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35931.197 +# Visual Studio Version 18 +VisualStudioVersion = 18.3.11520.95 d18.3 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}" EndProject @@ -106,6 +106,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.UI.Blazor", " 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}" 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 GlobalSection(SolutionConfigurationPlatforms) = preSolution 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|x86.ActiveCfg = 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 GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -608,6 +622,7 @@ Global {AD3BC36E-8FC9-4A13-AD6B-606325AFF291} = {F3414823-B70E-435E-B4EA-80ABF4371449} {0C14CF80-D743-4809-9B9C-2A096FEA2E06} = {FA674B5A-3394-926C-2B1E-70E5B00E4A5C} {9AE35B63-607E-4009-9FE6-3DF2CD98071F} = {F3414823-B70E-435E-B4EA-80ABF4371449} + {FAD15887-EFB2-4FA5-8BD9-586C1DB2B0BE} = {D05689E3-04C6-4E3B-ACA7-3F4507CED4CC} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3CE42AE5-D79F-4E97-A246-AA8FD228B677}