long candy ready to test
This commit is contained in:
@@ -3,6 +3,7 @@ using OpenCvSharp;
|
||||
using Serilog;
|
||||
using System.Net;
|
||||
using System.Runtime.InteropServices;
|
||||
using Newtonsoft.Json;
|
||||
using VisionBuilder.UI.Common;
|
||||
using VisionBuilder.UI.Common.RecipeProcessing;
|
||||
using CameraSettings = Inspectron.HawkEye.Protocol.CameraSettings;
|
||||
@@ -28,31 +29,54 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye
|
||||
IPAddress.Parse(_settings.Adapter));
|
||||
_client.ImageReceived += _client_ImageReceived;
|
||||
_client.SettingsReceived += _client_SettingsReceived;
|
||||
_client.CalibrationReceived += _client_CalibrationReceived;
|
||||
_client.SupportsCalibration = _settings.IsColor;
|
||||
_client.Connect();
|
||||
Log.Information("Connected to Hawkeye camera at {Adapter}", _settings.Adapter, 27001);
|
||||
|
||||
}
|
||||
|
||||
private void _client_CalibrationReceived(List<Dictionary<double, double>> obj)
|
||||
{
|
||||
Log.Information("Calibtating...");
|
||||
_bayerFilter = new OpenCVBayerProcessor();
|
||||
_bayerFilter.SetCalibration(obj);
|
||||
}
|
||||
|
||||
private void _client_SettingsReceived(CameraSettings obj)
|
||||
{
|
||||
ApplySettings(obj);
|
||||
}
|
||||
public void ApplySettings(CameraSettings obj)
|
||||
{
|
||||
_cameraSettings = UICameraSettings.LoadSettingsLocal(_settings.SettingsFile).ToCameraSettings();
|
||||
_client.ApplySettings(_cameraSettings);
|
||||
_cameraSettings= obj;
|
||||
if (File.Exists(_settings?.SettingsFile))
|
||||
{
|
||||
_cameraSettings = UICameraSettings.LoadSettingsLocal(_settings.SettingsFile).ToCameraSettings();
|
||||
_client.ApplySettings(_cameraSettings);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public Task<Mat> GetImage(CancellationToken token)
|
||||
{
|
||||
|
||||
_lastImage = null;
|
||||
if (_imageAquisitionTaskSource != null && !_imageAquisitionTaskSource.Task.IsCanceled)
|
||||
if (_imageAquisitionTaskSource != null && !_imageAquisitionTaskSource.Task.IsCanceled && !_imageAquisitionTaskSource.Task.IsCompleted)
|
||||
{
|
||||
_imageAquisitionTaskSource.SetCanceled(CancellationToken.None);
|
||||
_imageAquisitionTaskSource = null;
|
||||
|
||||
}
|
||||
_imageAquisitionTaskSource= new TaskCompletionSource<Mat>();
|
||||
if (token.CanBeCanceled)
|
||||
{
|
||||
token.Register(() =>
|
||||
{
|
||||
_imageAquisitionTaskSource.TrySetCanceled(token);
|
||||
});
|
||||
}
|
||||
_client.Trigger();
|
||||
return _imageAquisitionTaskSource.Task;
|
||||
|
||||
@@ -61,31 +85,52 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye
|
||||
private TaskCompletionSource<Mat>? _imageAquisitionTaskSource;
|
||||
private Mat _lastImage;
|
||||
byte[] _flipBuffer = new byte[2000 * 2000];
|
||||
private OpenCVBayerProcessor _bayerFilter;
|
||||
|
||||
private void _client_ImageReceived(byte[] obj)
|
||||
{
|
||||
Log.Debug("Got image on {adapter}", _settings.Adapter);
|
||||
FlipLines(obj, _flipBuffer);
|
||||
obj = _flipBuffer;
|
||||
var pinnedArray = GCHandle.Alloc(obj, GCHandleType.Pinned);
|
||||
var pointer = pinnedArray.AddrOfPinnedObject();
|
||||
|
||||
Mat image = new Mat(_cameraSettings.ImageSettings.Lines, _cameraSettings.ImageSettings.SensorWidth,
|
||||
MatType.CV_8UC1, pointer);
|
||||
|
||||
var xCrop = _cameraSettings.ImageSettings.SensorWidth - _cameraSettings.ImageWidth - _cameraSettings.OffsetX;
|
||||
|
||||
// crop the image with opencv
|
||||
_lastImage = image[0, _cameraSettings.ImageSettings.Lines, xCrop,
|
||||
xCrop + _cameraSettings.ImageWidth].Clone();
|
||||
|
||||
if (_cameraSettings.BayerFilter)
|
||||
try
|
||||
{
|
||||
_lastImage = BayerFilter(_lastImage);
|
||||
Log.Debug("Got image on {adapter}", _settings.Adapter);
|
||||
//FlipLines(obj, _flipBuffer);
|
||||
|
||||
var pinnedArray = GCHandle.Alloc(obj, GCHandleType.Pinned);
|
||||
var pointer = pinnedArray.AddrOfPinnedObject();
|
||||
|
||||
|
||||
Mat image = new Mat(_cameraSettings.ImageSettings.Lines, _cameraSettings.ImageSettings.SensorWidth,
|
||||
MatType.CV_8UC1, pointer);
|
||||
|
||||
|
||||
|
||||
var xCrop = _cameraSettings.ImageSettings.SensorWidth - _cameraSettings.ImageWidth -
|
||||
_cameraSettings.OffsetX;
|
||||
|
||||
// crop the image with opencv
|
||||
_lastImage = image[0, _cameraSettings.ImageSettings.Lines, xCrop,
|
||||
xCrop + _cameraSettings.ImageWidth].Clone();
|
||||
|
||||
|
||||
|
||||
|
||||
if (_cameraSettings.BayerFilter)
|
||||
{
|
||||
_lastImage = _bayerFilter.ProcessBayerImageWithChannelControl(_lastImage);
|
||||
}
|
||||
|
||||
// rotate 90 degrees CCW
|
||||
Cv2.Rotate(_lastImage, _lastImage, RotateFlags.Rotate90Counterclockwise);
|
||||
|
||||
//_lastImage = _lastImage.CvtColor(ColorConversionCodes.BGR2RGB);
|
||||
|
||||
_imageAquisitionTaskSource!.SetResult(_lastImage);
|
||||
|
||||
pinnedArray.Free();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex, "Error processing image from Hawkeye camera at {Adapter}", _settings.Adapter);
|
||||
}
|
||||
|
||||
_imageAquisitionTaskSource!.SetResult(_lastImage);
|
||||
|
||||
pinnedArray.Free();
|
||||
}
|
||||
|
||||
Mat BayerFilter(Mat image)
|
||||
@@ -96,8 +141,7 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye
|
||||
throw new ArgumentException("Input image is null or empty.", nameof(image));
|
||||
|
||||
Mat bgrImage = new Mat();
|
||||
// Use OpenCV's demosaicing function for Bayer BG pattern
|
||||
Cv2.CvtColor(image, bgrImage, ColorConversionCodes.BayerBG2BGR);
|
||||
Cv2.CvtColor(image, bgrImage, ColorConversionCodes.BayerRG2BGR);
|
||||
|
||||
return bgrImage;
|
||||
}
|
||||
@@ -127,7 +171,7 @@ namespace Hawkeye.VisionBuilder.UI.Sources.Hawkeye
|
||||
|
||||
public void InitializeModule()
|
||||
{
|
||||
|
||||
Open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user