using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using HalconDotNet; using System.ComponentModel; namespace HalconTools { public delegate void ContourDelegate(object sender, HImage image, ContourResult result); public class ContourAssistant { public event ContourDelegate ContourDone; /// HALCON image used for . public HImage mImage; public int mWidth; public int mHeight; public HWndCtrl viewController; public ROIController roiController; public ContourParam mContourPara = new ContourParam(); public HObject mObject; public HObject mThresholdObj; public HObject mSelectObj; public ContourResult mContourResult = new ContourResult(); public ContourAssistant() { initObj(); } public ContourAssistant(HWindowControl viewPort) { viewController = new HWndCtrl(viewPort); roiController = new ROIController(); initObj(); } public void initObj() { HOperatorSet.GenEmptyObj(out mObject); mObject.Dispose(); HOperatorSet.GenEmptyObj(out mThresholdObj); mThresholdObj.Dispose(); HOperatorSet.GenEmptyObj(out mSelectObj); mSelectObj.Dispose(); } public bool SetImage(string filename) { string tmp; try { mImage = new HImage(filename); mImage.GetImagePointer1(out tmp, out mWidth, out mHeight); } catch (HOperatorException e) { mImage = null; return false; } return true; } public bool SetImage(HImage image) { string tmp; try { mImage = image; mImage.GetImagePointer1(out tmp, out mWidth, out mHeight); } catch (HOperatorException e) { mImage = null; return false; } return true; } public HImage GetImage() { return mImage; } /// /// Writes the new image to graphic window /// public void UpdateImage() { viewController.resetAll(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.addIconicVar(mImage); viewController.repaint(); } public void UpdateObj(HObject obj) { viewController.resetAll(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue"); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1); viewController.addIconicVar(obj); viewController.repaint(); } public void UpdateObj(HObject obj, string color) { viewController.resetAll(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, color); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1); viewController.addIconicVar(obj); viewController.repaint(); } public void SetPara(ContourParam para) { this.mContourPara.AreaMax = para.AreaMax; this.mContourPara.AreaMin = para.AreaMin; this.mContourPara.ThresholdMax = para.ThresholdMax; this.mContourPara.ThresholdMin = para.ThresholdMin; this.mContourPara.SelectObj = para.SelectObj; } /// /// 二值化图像 /// /// 图像 /// public HObject ThresholdObj(HImage image) { HObject tmpObj; HOperatorSet.GenEmptyObj(out tmpObj); tmpObj.Dispose(); HOperatorSet.Threshold(image, out tmpObj, mContourPara.ThresholdMin, mContourPara.ThresholdMax); return tmpObj; } /// /// 根据面积剔除物体 /// /// /// public HObject SelectObj(HObject obj) { HObject tmpObj1, tmpObj2; //先将物体分开 HOperatorSet.GenEmptyObj(out tmpObj1); tmpObj1.Dispose(); HOperatorSet.Connection(obj, out tmpObj1); //选择物体 HOperatorSet.GenEmptyObj(out tmpObj2); tmpObj2.Dispose(); HOperatorSet.SelectShape(tmpObj1, out tmpObj2, "area", "and", mContourPara.AreaMin, mContourPara.AreaMax); return tmpObj2; } /// /// 根据序号选择物体 /// /// /// public HObject Select(HObject obj) { HObject tmpObj; HOperatorSet.GenEmptyObj(out tmpObj); tmpObj.Dispose(); HOperatorSet.SelectObj(obj, out tmpObj, mContourPara.SelectObj); return tmpObj; } public void Run() { mThresholdObj = ThresholdObj(mImage); mSelectObj = SelectObj(mThresholdObj); if (mSelectObj.CountObj() == 0) return; mObject = Select(mSelectObj); mContourResult.mObject = mObject; //获得各种结果 HTuple Area = null, Row = null, Col = null, hv_Rows1 = null, hv_Columns1 = null; HOperatorSet.AreaCenter(mObject, out Area, out Row, out Col); mContourResult.mArea = Area; mContourResult.center_Row = Row; mContourResult.center_Column =Col; HOperatorSet.GetRegionContour(mObject, out hv_Rows1, out hv_Columns1); mContourResult.hv_Columns = hv_Columns1; mContourResult.hv_Rows = hv_Rows1; if (ContourDone != null) { ContourDone(this, mImage, mContourResult); } } } }