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;
|
|
/// <summary>HALCON image used for .</summary>
|
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;
|
}
|
|
/// <summary>
|
/// Writes the new image to graphic window
|
/// </summary>
|
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);
|
}
|
}
|
}
|
}
|