|
@@ -46,12 +46,9 @@ namespace LampInspectionMachine.Core
|
|
|
public class Management : BindableBase
|
|
|
{
|
|
|
|
|
|
- private bool isConnected = false;
|
|
|
|
|
|
|
|
|
- private CogJobManager myJobManager;
|
|
|
- private List<CogJob> myJobs = new List<CogJob>();
|
|
|
- private List<CogJobIndependent> myIndependentJobs = new List<CogJobIndependent>();
|
|
|
+
|
|
|
private CameraView cameraView;
|
|
|
private ICogImage image = new CogImage8Grey();
|
|
|
private WriteableBitmap writeable;
|
|
@@ -75,12 +72,6 @@ namespace LampInspectionMachine.Core
|
|
|
|
|
|
public CameraService CameraService { get; set; }
|
|
|
|
|
|
- public CogJobManager MyJobManager { get => myJobManager; set => myJobManager = value; }
|
|
|
- public List<CogJob> MyJobs { get => myJobs; set => myJobs = value; }
|
|
|
- public List<CogJobIndependent> MyIndependentJobs { get => myIndependentJobs; set => myIndependentJobs = value; }
|
|
|
-
|
|
|
-
|
|
|
- public CogJobManagerEdit MyJobManagerEdit { get => myJobManagerEdit; set => myJobManagerEdit = value; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 相机列表
|
|
@@ -91,43 +82,47 @@ namespace LampInspectionMachine.Core
|
|
|
/// <summary>
|
|
|
/// 当前相机配置
|
|
|
/// </summary>
|
|
|
- public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } }
|
|
|
+ public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 相机配置列表
|
|
|
/// </summary>
|
|
|
public ObservableCollection<CameraInfo> CamConfigs { get => _CamConfigs; set { SetProperty(ref _CamConfigs, value); } }
|
|
|
|
|
|
- public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
|
|
|
+ // public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
|
|
|
|
|
|
- public ICamera MyCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
|
|
|
+ public ICamera CurrCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 相机对应模板工具
|
|
|
/// </summary>
|
|
|
- public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
|
|
|
+ // public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
|
|
|
|
|
|
public event Action<int> ToolBlockSwitched;
|
|
|
/// <summary>
|
|
|
/// 当前选中相机的SN
|
|
|
/// </summary>
|
|
|
- public string CurrCameraSn { get => _CurrCameraSn; set { SetProperty(ref _CurrCameraSn, value); } }
|
|
|
+ public string CurrCameraSn { get => _CurrCameraSn;
|
|
|
+ set { SetProperty(ref _CurrCameraSn, value); } }
|
|
|
+
|
|
|
+ public List<VisionProManager> VisionProManagers { get => _visionProManagers; set { SetProperty(ref _visionProManagers, value); } }
|
|
|
+
|
|
|
+ public VisionProManager Currvision { get => _Currvision; set => _Currvision = value ; }
|
|
|
|
|
|
private ObservableCollection<CameraInfo> _CamConfigs = new ObservableCollection<CameraInfo>();
|
|
|
|
|
|
- private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
|
|
|
+ private List<VisionProManager> _visionProManagers=new List<VisionProManager>();
|
|
|
|
|
|
- private CogToolBlock cogToolBlock1;
|
|
|
+ // private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
|
|
|
|
|
|
+ private CogToolBlock cogToolBlock1;
|
|
|
+ private VisionProManager _Currvision;
|
|
|
private CameraInfo _CurrCamConfig = null;
|
|
|
private ICamera myCamera;
|
|
|
- private bool _isTriggerModel = false;
|
|
|
+ //private bool _isTriggerModel = false;
|
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 当前需要显示的工程文件
|
|
|
- /// </summary>
|
|
|
- private CogJobManagerEdit myJobManagerEdit;
|
|
|
+
|
|
|
|
|
|
private ObservableCollection<string> _CameraList = new ObservableCollection<string>();
|
|
|
|
|
@@ -152,13 +147,14 @@ namespace LampInspectionMachine.Core
|
|
|
CameraList = FindLoadCamera();
|
|
|
if (CamConfigs.Count == 0)
|
|
|
{
|
|
|
-
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam1.vpp" });
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam2.vpp" });
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam3.vpp" });
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam4.vpp" });
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam5.vpp" });
|
|
|
- CamConfigs.Add(new CameraInfo() { VppFileName = "Cam6.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName="相机1", Id=new Guid(), SerialNumber="", VppIndex=0, VppFileName = "Cam1.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机2", Id = new Guid(), SerialNumber = "", VppIndex = 1, VppFileName = "Cam2.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机3", Id = new Guid(), SerialNumber = "", VppIndex = 2, VppFileName = "Cam3.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机4", Id = new Guid(), SerialNumber = "", VppIndex = 3, VppFileName = "Cam4.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机5", Id = new Guid(), SerialNumber = "", VppIndex = 4, VppFileName = "Cam5.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机6", Id = new Guid(), SerialNumber = "", VppIndex = 5, VppFileName = "Cam6.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机7", Id = new Guid(), SerialNumber = "", VppIndex = 6, VppFileName = "Cam7.vpp" });
|
|
|
+ CamConfigs.Add(new CameraInfo() { CameraName = "相机8", Id = new Guid(), SerialNumber = "", VppIndex = 7, VppFileName = "Cam8.vpp" });
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -169,37 +165,30 @@ namespace LampInspectionMachine.Core
|
|
|
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 初始化模板
|
|
|
+ /// 初始化相机管理
|
|
|
/// </summary>
|
|
|
- public void InitTemplates(TipService tipService)
|
|
|
+ public void InitTemplates(TipService tipService,Management management)
|
|
|
{
|
|
|
-
|
|
|
-
|
|
|
tipService.ShowMsg("相机模板加载2%");
|
|
|
- CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam1.vpp");
|
|
|
- CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载10%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam2.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载26%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam3.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载39%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam4.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载52%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam5.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载65%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam6.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载78%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam7.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载91%");
|
|
|
- //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam8.vpp");
|
|
|
- //CamTemplateS.Add(cogToolBlock);
|
|
|
- //tipService.ShowMsg("相机模板加载99%");
|
|
|
+ for ( int i = 0; i < 1; i++ )
|
|
|
+ {
|
|
|
+
|
|
|
+ CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + $"\\Vpp\\{CamConfigs[i].VppFileName}");
|
|
|
+ VisionProManager vision=new VisionProManager();
|
|
|
+ ICamera myCamera;
|
|
|
+ myCamera = CreateCamera(CamConfigs[i]);
|
|
|
+ if ( myCamera.IsConnected)
|
|
|
+ {
|
|
|
+ myCamera.ImageCallbackEvent += vision.CamCallBack;
|
|
|
+ myCamera.GrabImageCallbackEvent += vision.ImageCallback;
|
|
|
+ }
|
|
|
+ vision.Camera= myCamera;
|
|
|
+ vision.CogToolBlock = cogToolBlock;
|
|
|
+ vision.CameraInfo = CamConfigs[ i ];
|
|
|
+ vision.Management=management;
|
|
|
+ VisionProManagers.Add(vision);
|
|
|
+ tipService.ShowMsg($"相机模板加载{(i+1)*10+2}%");
|
|
|
+ }
|
|
|
tipService.Tcolse();
|
|
|
}
|
|
|
|
|
@@ -208,20 +197,14 @@ namespace LampInspectionMachine.Core
|
|
|
/// </summary>
|
|
|
public void SoftTrigger()
|
|
|
{
|
|
|
- if (isConnected)
|
|
|
+ if ( CurrCamera.IsConnected )
|
|
|
{
|
|
|
- MyCamera.StopGrabbing();
|
|
|
+ CurrCamera.StopGrabbing();
|
|
|
LogHelper.Info($"软触发配置写入");
|
|
|
- //MyCamera.SetTriggerModeOff();
|
|
|
- //CurrCamConfig.TriggerMode = false;
|
|
|
- //MyCamera.SetTriggerSoftware();
|
|
|
- //if (!MyCamera.CheckImageCallbackEvent(CamCallBack))
|
|
|
- // MyCamera.ImageCallbackEvent -= CamCallBack;
|
|
|
- //if (MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
|
|
|
- // MyCamera.ImageCallbackEvent += CamVisionProCallBack;
|
|
|
+ CurrCamera.SetTriggerMode(false,7) ;
|
|
|
+ CurrCamConfig.TriggerMode = false;
|
|
|
LogHelper.Info($"软触发取图");
|
|
|
-
|
|
|
- MyCamera.Grab();
|
|
|
+ CurrCamera.Grab();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -230,7 +213,7 @@ namespace LampInspectionMachine.Core
|
|
|
/// 连续采集写入
|
|
|
/// </summary>
|
|
|
public void SoftTrigger__Continue()
|
|
|
- {
|
|
|
+ { CurrCamera.StopGrabbing();
|
|
|
//MyCamera.SetTriggerModeOff();
|
|
|
//CurrCamConfig.TriggerMode = false;
|
|
|
//MyCamera.SetTriggerSoftware();
|
|
@@ -239,7 +222,7 @@ namespace LampInspectionMachine.Core
|
|
|
//if (!MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
|
|
|
// MyCamera.ImageCallbackEvent -= CamVisionProCallBack;
|
|
|
LogHelper.Info($"连续采集启动");
|
|
|
- MyCamera.StartGrabbing();
|
|
|
+ CurrCamera.StartGrabbing();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -253,7 +236,7 @@ namespace LampInspectionMachine.Core
|
|
|
// MyCamera.ImageCallbackEvent -= CamCallBack;
|
|
|
//if (MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
|
|
|
// MyCamera.ImageCallbackEvent += CamVisionProCallBack;
|
|
|
- MyCamera.StartGrabbing();
|
|
|
+ CurrCamera.StartGrabbing();
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 查找相机
|
|
@@ -263,10 +246,12 @@ namespace LampInspectionMachine.Core
|
|
|
var listsn = MvCamera.GetDevices();
|
|
|
if (listsn.Length > 0)
|
|
|
{
|
|
|
+
|
|
|
ObservableCollection<string> strings = new ObservableCollection<string>();
|
|
|
+ strings.Add("");
|
|
|
for (int i = 0; i < listsn.Length; i++)
|
|
|
{
|
|
|
- //strings.Add(listsn[i].);
|
|
|
+ strings.Add(listsn[i].SerialNumber);
|
|
|
}
|
|
|
return strings;
|
|
|
}
|
|
@@ -278,298 +263,214 @@ namespace LampInspectionMachine.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void InitCamera(string name)
|
|
|
+ public bool InitCamera()
|
|
|
{
|
|
|
- // 初始化相机
|
|
|
- if (isConnected && myCamera != null)
|
|
|
+ ICamera myCamera;
|
|
|
+ if ( CurrCamera!=null&& CurrCamera.IsConnected )
|
|
|
{
|
|
|
- myCamera.CloseDevice();
|
|
|
- myCamera = null;
|
|
|
- }
|
|
|
- Guid guid = new Guid();
|
|
|
- CameraService.CreateCamera(guid, new CameraInfo() { SerialNumber = name });
|
|
|
- myCamera = CameraService.GetCamera(guid);
|
|
|
- bool res = myCamera.OpenDevice();
|
|
|
+ CurrCamera.CloseDevice();
|
|
|
+ myCamera = CameraService.GetCamera(CurrCamera.ID);
|
|
|
+ bool res = myCamera.OpenDevice();
|
|
|
|
|
|
- if (!res)
|
|
|
- {
|
|
|
- myCamera.CloseDevice();
|
|
|
- myCamera = null;
|
|
|
- isConnected = false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isConnected = true;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- public void InitCameras()
|
|
|
- {
|
|
|
- CameraService = new CameraService();
|
|
|
- foreach (var item in CamConfigs)
|
|
|
- {
|
|
|
- try
|
|
|
+ if ( !res )
|
|
|
{
|
|
|
- CameraService.CreateCamera(item.Id, item);
|
|
|
- CameraService.GetCamera(item.Id).CameraConnectChangedEvent += Management_CameraConnectChangedEvent;
|
|
|
- if (CameraService.GetCamera(item.Id).OpenDevice())
|
|
|
- {
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
+ myCamera.CloseDevice();
|
|
|
+ myCamera = null;
|
|
|
+ return false;
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+ else
|
|
|
{
|
|
|
-
|
|
|
+ CurrCamera = myCamera;
|
|
|
+ CurrCamConfig.SerialNumber = myCamera.SerialNumber;
|
|
|
+ if ( myCamera.IsConnected )
|
|
|
+ {
|
|
|
+ myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
|
|
|
+ myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
|
|
|
+ myCamera.ImageCallbackEvent += Currvision.CamCallBack;
|
|
|
+ myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- public void CloseCamera()
|
|
|
- {
|
|
|
- myCamera?.StopGrabbing();
|
|
|
- myCamera?.CloseDevice();
|
|
|
- myCamera = null;
|
|
|
- isConnected = false;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- ///图像显示
|
|
|
- /// </summary>
|
|
|
- /// <param name="img"></param>
|
|
|
- private void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
-
|
|
|
- Image = image;
|
|
|
-
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- ///图像显示
|
|
|
- /// </summary>
|
|
|
- /// <param name="img"></param>
|
|
|
- private void MainCamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
|
|
|
- {
|
|
|
- try
|
|
|
+ else
|
|
|
{
|
|
|
-
|
|
|
- Image = image;
|
|
|
-
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
-
|
|
|
+ CurrCamera = null;
|
|
|
+ myCamera=CreateCamera(new CameraInfo() { SerialNumber=CurrCameraSn });
|
|
|
+ CurrCamera = myCamera;
|
|
|
+ CurrCamConfig.SerialNumber = myCamera.SerialNumber;
|
|
|
+ if ( myCamera.IsConnected )
|
|
|
+ {
|
|
|
+ myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
|
|
|
+ myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
|
|
|
+ myCamera.ImageCallbackEvent += Currvision.CamCallBack;
|
|
|
+ myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|
|
|
- // 将海康相机帧数据转换为CogImage8Grey灰度图像
|
|
|
- public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
|
|
|
+ public ICamera CreateCamera(CameraInfo cameraInfo)
|
|
|
{
|
|
|
-
|
|
|
- // 验证像素格式(支持MONO8/RGB8转灰度)
|
|
|
- if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
|
|
|
- pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
|
|
|
- {
|
|
|
- throw new ArgumentException("Unsupported pixel format");
|
|
|
- }
|
|
|
-
|
|
|
- // 创建CogImage8Grey对象
|
|
|
- CogImage8Grey cogImage = new CogImage8Grey();
|
|
|
- int width = (int)pFrameInfo.nWidth;
|
|
|
- int height = (int)pFrameInfo.nHeight;
|
|
|
-
|
|
|
- // 分配内存并复制数据
|
|
|
- cogImage.Allocate(width, height);
|
|
|
-
|
|
|
- // 获取8位灰度图像像素内存区域
|
|
|
- ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
|
|
|
- CogImageDataModeConstants.ReadWrite,
|
|
|
- 0, 0,
|
|
|
- cogImage.Width, cogImage.Height);
|
|
|
- IntPtr destPtr = pixelMemory.Scan0; // 获取像素数据指针
|
|
|
-
|
|
|
- // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
|
|
|
-
|
|
|
- if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
|
|
|
- {
|
|
|
- // 直接拷贝MONO8数据
|
|
|
- SafeMemoryCopy(destPtr, pData, width * height);
|
|
|
- }
|
|
|
- else // RGB转灰度
|
|
|
+ Guid guid = Guid.NewGuid();
|
|
|
+ CameraService.CreateCamera(guid, cameraInfo);
|
|
|
+ ICamera myCamera = CameraService.GetCamera(guid);
|
|
|
+ if ( myCamera != null )
|
|
|
{
|
|
|
- byte[] rgbBuffer = new byte[width * height * 3];
|
|
|
- Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
|
|
|
-
|
|
|
- unsafe
|
|
|
+ try
|
|
|
{
|
|
|
- byte* pDest = (byte*)destPtr.ToPointer();
|
|
|
- for (int i = 0; i < rgbBuffer.Length; i += 3)
|
|
|
+ bool res = myCamera.OpenDevice();
|
|
|
+ if ( !res )
|
|
|
{
|
|
|
- // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
|
|
|
- *pDest++ = (byte)(0.299 * rgbBuffer[i] +
|
|
|
- 0.587 * rgbBuffer[i + 1] +
|
|
|
- 0.114 * rgbBuffer[i + 2]);
|
|
|
+ myCamera.CloseDevice();
|
|
|
+ myCamera = null;
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return myCamera;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- return cogImage;
|
|
|
- }
|
|
|
-
|
|
|
- // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
|
|
|
- public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
|
|
|
- {
|
|
|
- if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
|
|
|
- {
|
|
|
- throw new ArgumentException("Only RGB8 format supported for color conversion");
|
|
|
- }
|
|
|
-
|
|
|
- CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
|
|
|
- int width = (int)pFrameInfo.nWidth;
|
|
|
- int height = (int)pFrameInfo.nHeight;
|
|
|
-
|
|
|
- // 分配内存
|
|
|
- cogColorImage.Allocate(width, height);
|
|
|
-
|
|
|
- // 获取三个颜色平面指针
|
|
|
-
|
|
|
- CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
|
|
|
- CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
|
|
|
- CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
|
|
|
- CogImageDataModeConstants.ReadWrite,
|
|
|
- 0, 0,
|
|
|
- red.Width, red.Height).Scan0; // 获取像素数据指针
|
|
|
- IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
|
|
|
- CogImageDataModeConstants.ReadWrite,
|
|
|
- 0, 0,
|
|
|
- red.Width, red.Height).Scan0; ;
|
|
|
- IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
|
|
|
- CogImageDataModeConstants.ReadWrite,
|
|
|
- 0, 0,
|
|
|
- red.Width, red.Height).Scan0; ;
|
|
|
-
|
|
|
- // 转换RGB数据到平面格式
|
|
|
- byte[] rgbBuffer = new byte[width * height * 3];
|
|
|
- Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
|
|
|
-
|
|
|
- unsafe
|
|
|
- {
|
|
|
- byte* pRed = (byte*)redPtr.ToPointer();
|
|
|
- byte* pGreen = (byte*)greenPtr.ToPointer();
|
|
|
- byte* pBlue = (byte*)bluePtr.ToPointer();
|
|
|
-
|
|
|
- for (int i = 0; i < rgbBuffer.Length; i += 3)
|
|
|
+ catch
|
|
|
{
|
|
|
- *pRed++ = rgbBuffer[i]; // R
|
|
|
- *pGreen++ = rgbBuffer[i + 1]; // G
|
|
|
- *pBlue++ = rgbBuffer[i + 2]; // B
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
- return cogColorImage;
|
|
|
+ return myCamera;
|
|
|
}
|
|
|
|
|
|
- // 使用示例(在回调函数中调用)
|
|
|
- private void ImageCallback(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
|
|
|
- {
|
|
|
- ICogImage resultImage;
|
|
|
- if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
|
|
|
- {
|
|
|
- resultImage = ConvertToCogImage(pData, ref pFrameInfo);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- resultImage = ConvertToColorCogImage(pData, ref pFrameInfo);
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
- Image = resultImage;
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 视觉处理
|
|
|
- /// </summary>
|
|
|
- /// <param name="data"></param>
|
|
|
- private void CamVisionProCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
|
|
|
+ public void CloseCamera()
|
|
|
{
|
|
|
- try
|
|
|
- {
|
|
|
-
|
|
|
- cogToolBlock1.Inputs[0].Value = image;
|
|
|
- cogToolBlock1.Run();
|
|
|
- Image = (ICogImage)cogToolBlock1.Outputs[6].Value;
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
+ CurrCamera?.StopGrabbing();
|
|
|
+ CurrCamera?.CloseDevice();
|
|
|
+ CurrCamera = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// WriteableBitmap转Bitmap图像
|
|
|
- /// </summary>
|
|
|
- /// <param name="wBitmap"></param>
|
|
|
- /// <returns></returns>
|
|
|
- public static Bitmap SafeConvert(WriteableBitmap wb)
|
|
|
- {
|
|
|
- Bitmap bmp = new Bitmap(wb.PixelWidth, wb.PixelHeight);
|
|
|
- using (var ms = new System.IO.MemoryStream())
|
|
|
- {
|
|
|
- var encoder = new PngBitmapEncoder();
|
|
|
- encoder.Frames.Add(BitmapFrame.Create(wb));
|
|
|
- encoder.Save(ms);
|
|
|
- bmp = (Bitmap)System.Drawing.Image.FromStream(ms);
|
|
|
- }
|
|
|
- return bmp;
|
|
|
- }
|
|
|
-
|
|
|
- // 使用Windows API实现内存拷贝(支持重叠内存区域)
|
|
|
- [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
|
|
|
- private static extern void RtlMoveMemory(IntPtr dest, IntPtr src, uint length);
|
|
|
-
|
|
|
- // 安全封装方法(带参数校验)
|
|
|
- public static void SafeMemoryCopy(IntPtr dest, IntPtr src, int byteCount)
|
|
|
- {
|
|
|
- if (dest == IntPtr.Zero || src == IntPtr.Zero)
|
|
|
- throw new ArgumentNullException("指针参数不能为null");
|
|
|
|
|
|
- if (byteCount <= 0)
|
|
|
- throw new ArgumentOutOfRangeException("字节数必须大于0");
|
|
|
+
|
|
|
+
|
|
|
+ // // 将海康相机帧数据转换为CogImage8Grey灰度图像
|
|
|
+ // public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
|
|
|
+ // {
|
|
|
+
|
|
|
+ // // 验证像素格式(支持MONO8/RGB8转灰度)
|
|
|
+ // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
|
|
|
+ // pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
|
|
|
+ // {
|
|
|
+ // throw new ArgumentException("Unsupported pixel format");
|
|
|
+ // }
|
|
|
+
|
|
|
+ // // 创建CogImage8Grey对象
|
|
|
+ // CogImage8Grey cogImage = new CogImage8Grey();
|
|
|
+ // int width = (int)pFrameInfo.nWidth;
|
|
|
+ // int height = (int)pFrameInfo.nHeight;
|
|
|
+
|
|
|
+ // // 分配内存并复制数据
|
|
|
+ // cogImage.Allocate(width, height);
|
|
|
+
|
|
|
+ // // 获取8位灰度图像像素内存区域
|
|
|
+ // ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
|
|
|
+ //CogImageDataModeConstants.ReadWrite,
|
|
|
+ //0, 0,
|
|
|
+ //cogImage.Width, cogImage.Height);
|
|
|
+ // IntPtr destPtr = pixelMemory.Scan0; // 获取像素数据指针
|
|
|
+
|
|
|
+ // // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
|
|
|
+
|
|
|
+ // if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
|
|
|
+ // {
|
|
|
+ // // 直接拷贝MONO8数据
|
|
|
+ // SafeMemoryCopy(destPtr, pData, width * height);
|
|
|
+ // }
|
|
|
+ // else // RGB转灰度
|
|
|
+ // {
|
|
|
+ // byte[] rgbBuffer = new byte[width * height * 3];
|
|
|
+ // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
|
|
|
+
|
|
|
+ // unsafe
|
|
|
+ // {
|
|
|
+ // byte* pDest = (byte*)destPtr.ToPointer();
|
|
|
+ // for (int i = 0; i < rgbBuffer.Length; i += 3)
|
|
|
+ // {
|
|
|
+ // // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
|
|
|
+ // *pDest++ = (byte)(0.299 * rgbBuffer[i] +
|
|
|
+ // 0.587 * rgbBuffer[i + 1] +
|
|
|
+ // 0.114 * rgbBuffer[i + 2]);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // return cogImage;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
|
|
|
+ // public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
|
|
|
+ // {
|
|
|
+ // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
|
|
|
+ // {
|
|
|
+ // throw new ArgumentException("Only RGB8 format supported for color conversion");
|
|
|
+ // }
|
|
|
+
|
|
|
+ // CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
|
|
|
+ // int width = (int)pFrameInfo.nWidth;
|
|
|
+ // int height = (int)pFrameInfo.nHeight;
|
|
|
+
|
|
|
+ // // 分配内存
|
|
|
+ // cogColorImage.Allocate(width, height);
|
|
|
+
|
|
|
+ // // 获取三个颜色平面指针
|
|
|
+
|
|
|
+ // CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
|
|
|
+ // CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
|
|
|
+ // CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
|
|
|
+ //CogImageDataModeConstants.ReadWrite,
|
|
|
+ //0, 0,
|
|
|
+ //red.Width, red.Height).Scan0; // 获取像素数据指针
|
|
|
+ // IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
|
|
|
+ //CogImageDataModeConstants.ReadWrite,
|
|
|
+ //0, 0,
|
|
|
+ //red.Width, red.Height).Scan0; ;
|
|
|
+ // IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
|
|
|
+ //CogImageDataModeConstants.ReadWrite,
|
|
|
+ //0, 0,
|
|
|
+ //red.Width, red.Height).Scan0; ;
|
|
|
+
|
|
|
+ // // 转换RGB数据到平面格式
|
|
|
+ // byte[] rgbBuffer = new byte[width * height * 3];
|
|
|
+ // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
|
|
|
+
|
|
|
+ // unsafe
|
|
|
+ // {
|
|
|
+ // byte* pRed = (byte*)redPtr.ToPointer();
|
|
|
+ // byte* pGreen = (byte*)greenPtr.ToPointer();
|
|
|
+ // byte* pBlue = (byte*)bluePtr.ToPointer();
|
|
|
+
|
|
|
+ // for (int i = 0; i < rgbBuffer.Length; i += 3)
|
|
|
+ // {
|
|
|
+ // *pRed++ = rgbBuffer[i]; // R
|
|
|
+ // *pGreen++ = rgbBuffer[i + 1]; // G
|
|
|
+ // *pBlue++ = rgbBuffer[i + 2]; // B
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // return cogColorImage;
|
|
|
+ // }
|
|
|
|
|
|
- RtlMoveMemory(dest, src, (uint)byteCount);
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 将WriteableBitmap转换为CogImage8Grey(自动处理彩色转灰度)
|
|
|
- /// </summary>
|
|
|
|
|
|
public void OnSwitchToolBlock(int index)
|
|
|
{
|
|
|
- cogToolBlock1 = CamTemplateS[index];
|
|
|
+ cogToolBlock1 = VisionProManagers[index].CogToolBlock;
|
|
|
+ CurrCamera= VisionProManagers[ index ].Camera;
|
|
|
+ CurrCamConfig = VisionProManagers[ index ].CameraInfo;
|
|
|
+
|
|
|
ToolBlockSwitched?.Invoke(index); // 触发事件,传递索引参数。
|
|
|
}
|
|
|
|