using HalconDotNet; using LB_SmartVisionCommon; using LB_VisionControl; using System; using System.Collections.Generic; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LB_VisionProcesses.Alogrithms.Halcon { public enum ImageFilterType { Mean, Guass, Median } [Process("Halcon2D图像滤波", Category = "Halcon2D工具", Description = "创建滤波工具")] public class HFilterTool : TAlgorithm { public HFilterTool() { strProcessClass = "LB_VisionProcesses.Alogrithms.Halcon.HFilterTool"; strProcessName = "Halcon2D图像滤波工具"; Params.Inputs.Add("滤波器类型", "均值滤波"); Params.Inputs.Add("掩膜宽", 1); Params.Inputs.Add("掩膜高", 1); //mean_image(Image : ImageMean : MaskWidth, MaskHeight : ) Params.Inputs.Add("滤波器类型", "高斯滤波"); Params.Inputs.Add("高斯核尺寸", 1.0); //gauss_filter(Image : ImageGauss : Size : ) Params.Inputs.Add("滤波器类型", "中值滤波"); Params.Inputs.Add("掩膜宽", 1); Params.Inputs.Add("掩膜高", 1); //median_rect(Image : ImageMedian :MaskWidth,MaskHeight:) Params.ROI = new HSegment(0, 0, 250, 250); } List recordFilterDatas = new List(); /// /// 算子逻辑 /// 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; } if (InputImage is Bitmap) { try { using (HImage hImage = new HImage()) { Bitmap bitmap = (Bitmap)InputImage; Rectangle rect = new Rectangle(0, 0, ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height); BitmapData srcBmpData = ((Bitmap)bitmap).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, "byte", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, 0, -1, 0); ((Bitmap)bitmap).UnlockBits(srcBmpData); bitmap.Dispose(); bitmap = null; InputImage = null; InputImage = hImage.Clone(); } } catch (Exception ex) { } } if (!(InputImage is HObject)) { Msg = "输入图片格式不为HObject"; 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); object DomainImage = null; if (!ReduceDomainImage(InputImage, ref DomainImage)) { Msg = "裁剪区域失败"; Result = false; return; } #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["掩膜高"]); int hv_Size = Convert.ToInt16(Params.Inputs["高斯核尺寸"]); recordFilterDatas = FilterManager.Instance.GetAllUsers(); string hv_FilterType = ""; foreach (var recordFilterData in recordFilterDatas) { switch (recordFilterData.FilterName) { case FilterType.均值滤波_MeanImage: hv_FilterType = "mean"; hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth); hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight); Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size); break; case FilterType.高斯滤波_GaussFilter: hv_FilterType = "gauss"; hv_Size = Convert.ToInt16(recordFilterData.GaussSize); Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size); break; case FilterType.中值滤波_MedianRect: hv_FilterType = "median"; hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth); hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight); Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size); break; default: hv_FilterType = "median"; hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth); hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight); Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size); break; } } #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 } } } }