using HalconDotNet; using LB_VisionControl; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Runtime.InteropServices.JavaScript.JSType; namespace LB_VisionProcesses.Alogrithms.Halcon { public enum ImageEnhancementType { Emphasize, EquHisto, ScaleMax } [Process("Halcon图像增强", Category = "Halcon2D工具", Description = "创建图像增强工具")] public class HImageEnhancementTool : TAlgorithm { public HImageEnhancementTool() { strProcessClass = "LB_VisionProcesses.Alogrithms.Halcon.HImageEnhancementTool"; strProcessName = "Halcon图像增强工具"; Params.Inputs.Add("滤波器类型", "边缘增强"); Params.Inputs.Add("掩膜宽", 1); Params.Inputs.Add("掩膜高", 1); Params.Inputs.Add("增强因子", 1.0); //emphasize(Image : ImageEmphasize : MaskWidth, MaskHeight, Factor : ) Params.Inputs.Add("滤波器类型", "直方图均衡化"); //equ_histo_image(Image : ImageEquHisto : : ) Params.Inputs.Add("滤波器类型", "比例增强"); //scale_image_max(Image : ImageScaleMax : : ) Params.ROI = new HSegment(0, 0, 250, 250); } /// /// 算子逻辑 /// public override void TAlgorithmMain() { #region 初始化变量 HObject ho_Regions, ho_LineXld; HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_LineXld); #endregion try { if (InputImage == null) { Msg = "输入图片为空"; Result = false; return; } #region 裁剪区域 if (!(Params.ROI is HSegment)) { Msg = "ROI类型错误,必须为HSegment类型"; Result = false; return; } if (!(InputImage is HObject)) { Msg = "输入图片类型错误,必须为HObject类型"; Result = false; return; } HObject DomainImage = ((HObject)InputImage)?.CopyObj(1, -1); #endregion #region 算子逻辑 Record = new ObjectRecord(); HObject hoDomainImage = DomainImage as HObject; HTuple hv_Channels = new HTuple(); //判断是否为灰度图 using (HDevDisposeHelper dh = new HDevDisposeHelper()) { try { HOperatorSet.CountChannels(hoDomainImage, out hv_Channels); if (hv_Channels.TupleInt() != 1) HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); //转换后再次检查是否为灰度图 HOperatorSet.CountChannels(hoDomainImage, out hv_Channels); if (hv_Channels.TupleInt() != 1) { HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); Msg = "输入图片不为灰度图"; Result = false; return; } } catch { Msg = "输入图片不为灰度图且转换失败"; Result = false; return; } } int hv_MaskWidth = Convert.ToInt16(Params.Inputs["掩膜宽"]); int hv_MaskHight = Convert.ToInt16(Params.Inputs["掩膜高"]); double hv_Factor = Convert.ToDouble(Params.Inputs["增强因子"]); Enum.TryParse(Params.Inputs["图像增强类型"]?.ToString(), out ImageEnhancementType imageEnhancementType); string hv_ImageEnhancementType = "scaleMax"; switch (imageEnhancementType) { case ImageEnhancementType.Emphasize: hv_ImageEnhancementType = "emphasize"; break; case ImageEnhancementType.EquHisto: hv_ImageEnhancementType = "equHisto"; break; case ImageEnhancementType.ScaleMax: default: hv_ImageEnhancementType = "scaleMax"; break; } double hv_Row1 = Convert.ToDouble(((HSegment)Params.ROI).BeginRow + Params.Fixture.Row); double hv_Column1 = Convert.ToDouble(((HSegment)Params.ROI).BeginColumn + Params.Fixture.Column); double hv_Row2 = Convert.ToDouble(((HSegment)Params.ROI).EndRow + Params.Fixture.Row); double hv_Column2 = Convert.ToDouble(((HSegment)Params.ROI).EndColumn + Params.Fixture.Column); ImageEnhancement(hoDomainImage, out ho_Regions, hv_ImageEnhancementType, hv_Column1, hv_Row2, hv_Column2); #endregion #region 生成OutputImage给后续处理 try { OutputImage = hoDomainImage; } catch (Exception ex) { Msg = "生成OutputImage失败,原因是:" + ex.ToString(); Result = false; return; } #endregion if (Msg == "运行超时") { Result = false; return; } Msg = "运行成功"; Result = true; return; } catch (Exception ex) { Msg = "运行失败,原因是:" + ex.ToString().TrimEnd(); OutputImage = null; Result = false; return; } finally { if (!Result) { Params.Outputs.Add("Segment", new HSegment()); } bCompleted = true; #region 内存释放 ho_Regions.Dispose(); #endregion } } } }