using System; using System.Collections.Generic; using System.Linq; using System.Text; using HalconDotNet; namespace HalconTools { public delegate void ScrewDelegate(ScrewResult result); public class ScrewAssistant { public event ScrewDelegate ScrewDone; /// HALCON image used for . public HImage mImage; public int mWidth; public int mHeight; public HWndCtrl viewController; public ROIController roiController; public ScrewParam mScrewPara = new ScrewParam(); public ScrewResult mScrewResult = new ScrewResult(); //中间参数 public HXLDCont XLDThresholdSubPix = new HXLDCont(); public HXLDCont XLDSelected = new HXLDCont(); public HXLDCont XLDRoundness = new HXLDCont(); public double row, col, radius; private HXLDCont tmpXLD = new HXLDCont(); private HXLDCont tmpXLD2 = new HXLDCont(); private HXLDCont tmpXLD3 = new HXLDCont(); public ScrewAssistant() { } public ScrewAssistant(HWindowControl viewPort) { viewController = new HWndCtrl(viewPort); roiController = new ROIController(); } 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; } /// /// 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.repaint(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue"); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2); viewController.addIconicVar(obj); viewController.repaint(); } public void UpdateObj(HObject obj, string color) { viewController.resetAll(); viewController.repaint(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, color); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2); viewController.addIconicVar(obj); viewController.repaint(); } public void SetPara(ScrewParam para) { mScrewPara.ThresholdSubPix = para.ThresholdSubPix; mScrewPara.RoundnessMin = para.RoundnessMin; mScrewPara.RoundnessMax = para.RoundnessMax; mScrewPara.RadiusMin = para.RadiusMin; mScrewPara.RadiusMax = para.RadiusMax; } public HXLDCont ThresholdSubPix(HImage image) { tmpXLD = image.ThresholdSubPix(mScrewPara.ThresholdSubPix); return tmpXLD; } public HXLDCont RoundnessXLD(HXLDCont xld) { tmpXLD = xld.SelectShapeXld("circularity", "and", mScrewPara.RoundnessMin, mScrewPara.RoundnessMax); return tmpXLD; } public HXLDCont SelectXLD(HXLDCont xld) { tmpXLD2 = xld.SelectShapeXld("width", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2); tmpXLD3 = tmpXLD2.SelectShapeXld("height", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2); return tmpXLD3; } public HXLDCont FitCircle(HXLDCont xld) { double phistart,phiend; string tmps; xld.FitCircleContourXld("atukey", -1, 0, 0, 3, 2, out row, out col, out radius, out phistart, out phiend, out tmps); tmpXLD = new HXLDCont(); tmpXLD.GenCircleContourXld(row, col, radius, 0, 6.28518, "positive", 1); return tmpXLD; } public void Run() { try { mScrewResult = new ScrewResult(); XLDThresholdSubPix = ThresholdSubPix(mImage); XLDRoundness = RoundnessXLD(XLDThresholdSubPix); XLDSelected = SelectXLD(XLDRoundness); mScrewResult.CircleCont = FitCircle(XLDSelected); mScrewResult.row = row; mScrewResult.col = col; mScrewResult.radius = radius; if (ScrewDone != null) { ScrewDone(mScrewResult); } } catch (Exception ex) { mScrewResult = null; if (ScrewDone != null) ScrewDone(mScrewResult); } } } }