using HalconDotNet; using LB_SmartVisionCommon; using LB_VisionControls; using System; using System.Collections.Generic; using System.Drawing.Imaging; 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 } public class HImageEnhancementTool : TAlgorithm { public HImageEnhancementTool() { strProcessClass = "LB_VisionProcesses.Alogrithms.Halcon.HImageEnhancementTool"; strProcessName = "Halcon2D_图像增强工具"; 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); } List recordImageEnhancementDatas = 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["掩膜高"]); double hv_Factor = Convert.ToDouble(Params.Inputs["增强因子"]); recordImageEnhancementDatas = ImageEnhancementManager.Instance.GetAllUsers(); string hv_ImageEnhancementType = ""; foreach (var recordImageEnhancementData in recordImageEnhancementDatas) { switch (recordImageEnhancementData.FilterName) { case ImageEnhancementDataType.边缘增强_ImageEmphasize: hv_ImageEnhancementType = "emphasize"; hv_MaskWidth = Convert.ToInt16(recordImageEnhancementData.MaskWidth); hv_MaskHight = Convert.ToInt16(recordImageEnhancementData.MaskHight); hv_Factor = Convert.ToDouble(recordImageEnhancementData.Factor); ImageEnhancement(hoDomainImage, out ho_Regions, hv_ImageEnhancementType, hv_MaskWidth, hv_MaskHight, hv_Factor); break; case ImageEnhancementDataType.直方图均衡化_EquHistoImage: hv_ImageEnhancementType = "equhisto"; ImageEnhancement(hoDomainImage, out ho_Regions, hv_ImageEnhancementType, hv_MaskWidth, hv_MaskHight, hv_Factor); break; case ImageEnhancementDataType.比例增强_ScaleImageMax: hv_ImageEnhancementType = "scaleimageMax"; ImageEnhancement(hoDomainImage, out ho_Regions, hv_ImageEnhancementType, hv_MaskWidth, hv_MaskHight, hv_Factor); break; default: hv_ImageEnhancementType = "scaleImageMax"; ImageEnhancement(hoDomainImage, out ho_Regions, hv_ImageEnhancementType, hv_MaskWidth, hv_MaskHight, hv_Factor); 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 } } } }