diff --git a/Rs.SkyLine/Flow/Camera/VisionManager.cs b/Rs.SkyLine/Flow/Camera/VisionManager.cs index b424ee8..cbb067d 100644 --- a/Rs.SkyLine/Flow/Camera/VisionManager.cs +++ b/Rs.SkyLine/Flow/Camera/VisionManager.cs @@ -15,6 +15,12 @@ using System.Windows.Forms; namespace Rs.MotionPlat.Flow.Camera { + public class SlotProductHasOrNotResult + { + public bool HasProduct { get; set; } = false; + public HObject SearchRegion { get; set; } + public HObject SourceImage { get; set; } + } /// /// 视觉管理类 /// @@ -34,80 +40,47 @@ namespace Rs.MotionPlat.Flow.Camera /// StockTray盘是否有料 /// 0 无料 1 有料 负数 错误返回错误码 /// - public static int StockTrayHasProduct(Action checkFinishedEvent) + public static SlotProductHasOrNotResult StockTrayHasProduct() { + SlotProductHasOrNotResult result = new SlotProductHasOrNotResult(); string cameraName = "upCamera"; - string LightName = ""; //1、拍照 - string m_savePath = Path.Combine("Recipe", GlobalVar.CurRecipe, "周转盘产品有无"); - //IniHelper iniHelper = new IniHelper(Path.Combine(m_savePath,"default.ini")); - //string AngleStart = iniHelper.ReadValue("ModelParam", "AngleStart", "-10"); - //string AngleExtent = iniHelper.ReadValue("ModelParam", "AngleExtent", "10"); - //string Score = iniHelper.ReadValue("ModelParam", "Score", "0.5"); - //string text = Path.Combine(m_savePath, "model.shm"); - //HOperatorSet.ReadShapeModel(text, out var modelID); + string m_savePath = Path.Combine("Recipe", GlobalVar.CurRecipe, "料仓料盘产品有无"); HOperatorSet.ReadRegion(out HObject searchRegion, Path.Combine(m_savePath , "搜索区域.reg")); - - ImageProcess.ClearManualTrigger(); - HikCamera.Instance.SetTrigger(cameraName, ETriggerMode.Manual); - HikCamera.Instance.SetExposure(cameraName, GlobalVar.UpCameraExposureTime); - HikCamera.Instance.SetGain(cameraName, GlobalVar.UpCameraGain); - AxisControl.LoadX.ComparePulse(2, false); - //LightName = SysConfigParam.GetValue(cameraName + "LightName"); - //if (!string.IsNullOrEmpty(LightName)) - //{ - // if (!string.IsNullOrEmpty(cameraName)) - // { - // IoManager.Instance.WriteOut(LightName, 0); - // Thread.Sleep(50); - // IoManager.Instance.WriteOut(LightName, 1); - // Thread.Sleep(100); - // HikCamera.Instance.Grab(cameraName); - // } - // else - // { - // Msg.ShowError("请先先择相机"); - // } - //} - //else - //{ - // Msg.ShowError("未设置相机对应的光源,请到变量中配置!"); - //} - - //AxisControl.LoadY.ComparePulse(0x01); - //Thread.Sleep(50); - //2、等待相机返回结果 - bool cameraOk = ImageProcess.manualTriggerEvent.WaitOne(3000); - if(cameraOk) + if(searchRegion.IsInitialized()) { - HObject hImage = new HObject(); - IoManager.Instance.WriteOut(LightName, 0); - HObject image = ImageProcess.GetManualImage(); - HOperatorSet.WriteImage(image, "bmp", 0, "d://images//111"); - if (cameraName == SysConfigParam.GetValue("UpCameraName")) - { - HOperatorSet.RotateImage(image, out hImage, SysConfigParam.GetValue("UpCameraRotate"), "constant"); - } - HOperatorSet.WriteImage(hImage, "bmp", 0, "d://images//111"); - checkFinishedEvent?.Invoke(hImage); - if (searchRegion.IsInitialized()) + result.SearchRegion = searchRegion; + ImageProcess.ClearManualTrigger(); + HikCamera.Instance.SetTrigger(cameraName, ETriggerMode.Manual); + HikCamera.Instance.SetExposure(cameraName, GlobalVar.UpCameraExposureTime); + HikCamera.Instance.SetGain(cameraName, GlobalVar.UpCameraGain); + AxisControl.LoadX.ComparePulse(2, false); + //2、等待相机返回结果 + bool cameraOk = ImageProcess.manualTriggerEvent.WaitOne(3000); + if (cameraOk) { + HObject hImage = new HObject(); + HObject image = ImageProcess.GetManualImage(); + if (cameraName == SysConfigParam.GetValue("UpCameraName")) + { + HOperatorSet.RotateImage(image, out hImage, SysConfigParam.GetValue("UpCameraRotate"), "constant"); + } + result.SourceImage = hImage; HOperatorSet.ReduceDomain(hImage, searchRegion, out HObject searchImg); HOperatorSet.Threshold(searchImg, out HObject whiteRegion, new HTuple(GlobalVar.StockTrayHaveOrNotGrayMin), new HTuple(GlobalVar.StockTrayHaveOrNotGrayMax)); HOperatorSet.AreaCenter(whiteRegion, out HTuple area, out HTuple row, out HTuple column); if (area.D > GlobalVar.StockTrayHaveOrNotGrayArea) - return 1; - //HOperatorSet.WriteImage(searchImg, "bmp", 0, "d://images//111"); - //HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1); - //HOperatorSet.FindShapeModel(searchImg, modelID, AngleTool.Deg2Rad(double.Parse(AngleStart)), AngleTool.Deg2Rad(Math.Abs((double.Parse(AngleExtent) - double.Parse(AngleStart)))), new HTuple(double.Parse(Score)), 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score); - //if(score.Length>0) - //{ - // return 1; - //} + { + result.HasProduct = true; + } + else + { + result.HasProduct = false; + } } } //3、返回结果 - return 0; + return result; } /// @@ -115,83 +88,50 @@ namespace Rs.MotionPlat.Flow.Camera /// 0 无料 1 有料 负数 错误返回错误码 /// /// - public static int TurnoverTrayHasProduct(Action checkFinishedEvent) + public static SlotProductHasOrNotResult TurnoverTrayHasProduct(Action checkFinishedEvent) { + SlotProductHasOrNotResult result = new SlotProductHasOrNotResult(); string cameraName = "upCamera"; - string LightName = ""; //1、拍照 ImageProcess.ClearManualTrigger(); - - string m_savePath = Path.Combine("Recipe", GlobalVar.CurRecipe, "周转盘产品定位"); - IniHelper iniHelper = new IniHelper(Path.Combine(m_savePath, "default.ini")); - string AngleStart = iniHelper.ReadValue("ModelParam", "AngleStart", "-10"); - string AngleExtent = iniHelper.ReadValue("ModelParam", "AngleExtent", "10"); - string Score = iniHelper.ReadValue("ModelParam", "Score", "0.5"); - string text = Path.Combine(m_savePath, "model.shm"); - HOperatorSet.ReadShapeModel(text, out var modelID); - HOperatorSet.ReadRegion(out HObject searchRegion, Path.Combine(m_savePath, "search.reg")); - + string m_savePath = Path.Combine("Recipe", GlobalVar.CurRecipe, "周转盘产品有无"); + HOperatorSet.ReadRegion(out HObject searchRegion, Path.Combine(m_savePath, "搜索区域.reg")); + result.SearchRegion = searchRegion; ImageProcess.ClearManualTrigger(); HikCamera.Instance.SetTrigger(cameraName, ETriggerMode.Manual); HikCamera.Instance.SetExposure(cameraName, GlobalVar.UpCameraExposureTime); HikCamera.Instance.SetGain(cameraName, GlobalVar.UpCameraGain); AxisControl.LoadX.ComparePulse(2, false); - //LightName = SysConfigParam.GetValue(cameraName + "LightName"); - //if (!string.IsNullOrEmpty(LightName)) - //{ - // if (!string.IsNullOrEmpty(cameraName)) - // { - // IoManager.Instance.WriteOut(LightName, 0); - // Thread.Sleep(50); - // IoManager.Instance.WriteOut(LightName, 1); - // Thread.Sleep(100); - // HikCamera.Instance.Grab(cameraName); - // } - // else - // { - // Msg.ShowError("请先先择相机"); - // } - //} - //else - //{ - // Msg.ShowError("未设置相机对应的光源,请到变量中配置!"); - //} - - //AxisControl.LoadY.ComparePulse(0x01); - //Thread.Sleep(50); + //2、等待相机返回结果 bool cameraOk = ImageProcess.manualTriggerEvent.WaitOne(3000); if (cameraOk) { HObject hImage = new HObject(); - //IoManager.Instance.WriteOut(LightName, 0); HObject image = ImageProcess.GetManualImage(); if (cameraName == SysConfigParam.GetValue("UpCameraName")) { HOperatorSet.RotateImage(image, out hImage, SysConfigParam.GetValue("UpCameraRotate"), "constant"); } checkFinishedEvent?.Invoke(hImage); + result.SourceImage = hImage; if (searchRegion.IsInitialized()) { - HOperatorSet.WriteImage(hImage, "bmp", 0, "d://images/22222"); HOperatorSet.ReduceDomain(hImage, searchRegion, out HObject searchImg); HOperatorSet.Threshold(searchImg, out HObject whiteRegion, new HTuple(GlobalVar.TurnoverTrayHaveOrNotGrayMin), new HTuple(GlobalVar.TurnoverTrayHaveOrNotGrayMax)); - //checkFinishedEvent?.Invoke(hImage); HOperatorSet.AreaCenter(whiteRegion, out HTuple area, out HTuple row1, out HTuple column1); if(area.D>GlobalVar.TurnoverTrayHaveOrNotGrayArea) { - return 1; + result.HasProduct = true; + } + else + { + result.HasProduct = false; } - //HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1); - //HOperatorSet.FindShapeModel(searchImg, modelID, AngleTool.Deg2Rad(double.Parse(AngleStart)), AngleTool.Deg2Rad(Math.Abs((double.Parse(AngleExtent) - double.Parse(AngleStart)))), new HTuple(double.Parse(Score)), 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score); - //if (score.Length > 0) - //{ - // return 1; - //} } } //3、返回结果 - return 0; + return result; } /// @@ -227,16 +167,18 @@ namespace Rs.MotionPlat.Flow.Camera vr.OffsetY = -1 * (row.D - upCameraScanBarCodeModel.ModelMatchResult[0].D) * GlobalVar.UpCameraMmPerPixel; vr.OffsetR = AngleTool.Rad2Deg((angle.D - upCameraScanBarCodeModel.ModelMatchResult[2].D)); vr.SourceImage = image; - if (Math.Abs(vr.OffsetX) < GlobalVar.TurnoverTrayLocateXRange - && Math.Abs(vr.OffsetY) < GlobalVar.TurnoverTrayLocateYRange - && Math.Abs(vr.OffsetR) < GlobalVar.TurnoverTrayLocateRRange) - { - vr.SearchModelOK = true; - } - else - { - vr.SearchModelOK = false; - } + vr.SearchModelOK = true; + //if (Math.Abs(vr.OffsetX) < GlobalVar.TurnoverTrayLocateXRange + // && Math.Abs(vr.OffsetY) < GlobalVar.TurnoverTrayLocateYRange + // && Math.Abs(vr.OffsetR) < GlobalVar.TurnoverTrayLocateRRange) + //{ + // vr.SearchModelOK = true; + //} + + } + else + { + vr.SearchModelOK = false; } } else