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}