using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using HalconDotNet;
|
using System.ComponentModel;
|
|
namespace HalconTools
|
{
|
public delegate void FitMessageDelegate(int value);
|
|
public delegate void SetImageDelegate(object sender, HImage image);
|
public delegate void FitLineDelegate(object sender, HImage image, FitLineResult result);
|
public delegate void FitCircleDelegate(object sender,HImage image,FitCircleResult result);
|
public class FitAssistant
|
{
|
public event FitLineDelegate FitLineDone;
|
public event FitCircleDelegate FitCircleDone;
|
public event FitMessageDelegate NotifyIconObserverMessage;
|
|
private const int ERR_READING_FILE = 0;
|
|
private const int ERR_NO_IMAGE = 1;
|
|
private const int ERR_PARAMSET = 2;
|
|
private const int ERR_FITLINE = 3;
|
|
private const int ERR_FITCIRCLE = 4;
|
|
|
|
/// <summary>HALCON image used for .</summary>
|
public HImage mImage;
|
public int mWidth;
|
public int mHeight;
|
|
|
public HWndCtrl viewController;
|
public ROIController roiController;
|
|
/// <summary>Error messages for failed measure actions.</summary>
|
public HTuple exceptionText;
|
|
private object someEventLock;
|
|
public FitAssistant()
|
{
|
NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage);
|
someEventLock = new object();
|
roiController = new ROIController();
|
}
|
|
public FitAssistant(HWindowControl viewPort)
|
{
|
NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage);
|
someEventLock = new object();
|
|
viewController = new HWndCtrl(viewPort);
|
roiController = new ROIController();
|
}
|
|
public void UpdateMessage(int val)
|
{
|
switch (val)
|
{
|
case FitAssistant.ERR_READING_FILE:
|
System.Windows.Forms.MessageBox.Show("Error Imge File!",
|
"Fit Wizard",
|
System.Windows.Forms.MessageBoxButtons.OK,
|
System.Windows.Forms.MessageBoxIcon.Information);
|
break;
|
case FitAssistant.ERR_NO_IMAGE:
|
System.Windows.Forms.MessageBox.Show("No Imge!",
|
"Fit Wizard",
|
System.Windows.Forms.MessageBoxButtons.OK,
|
System.Windows.Forms.MessageBoxIcon.Information);
|
break;
|
case FitAssistant.ERR_PARAMSET:
|
System.Windows.Forms.MessageBox.Show("Error param set!",
|
"Fit Wizard",
|
System.Windows.Forms.MessageBoxButtons.OK,
|
System.Windows.Forms.MessageBoxIcon.Information);
|
break;
|
case FitAssistant.ERR_FITLINE:
|
System.Windows.Forms.MessageBox.Show("Error fit line!",
|
"Fit Wizard",
|
System.Windows.Forms.MessageBoxButtons.OK,
|
System.Windows.Forms.MessageBoxIcon.Information);
|
break;
|
case FitAssistant.ERR_FITCIRCLE:
|
System.Windows.Forms.MessageBox.Show("Error fit circle!",
|
"Fit Wizard",
|
System.Windows.Forms.MessageBoxButtons.OK,
|
System.Windows.Forms.MessageBoxIcon.Information);
|
break;
|
default:
|
break;
|
}
|
}
|
|
public bool SetImage(string filename)
|
{
|
string tmp;
|
|
exceptionText = "";
|
try
|
{
|
mImage = new HImage(filename);
|
mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
|
}
|
catch (HOperatorException e)
|
{
|
mImage = null;
|
exceptionText = e.Message;
|
NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE);
|
return false;
|
}
|
return true;
|
}
|
|
public bool SetImage(HImage image)
|
{
|
string tmp;
|
|
exceptionText = "";
|
try
|
{
|
mImage = image;
|
mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
|
}
|
catch (HOperatorException e)
|
{
|
mImage = null;
|
exceptionText = e.Message;
|
NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE);
|
return false;
|
}
|
return true;
|
}
|
|
/// <summary>
|
/// Writes the new image to graphic window
|
/// </summary>
|
public void UpdateImage()
|
{
|
//viewController = new HWndCtrl(viewPort);
|
//roiController = new ROIController();
|
viewController.resetAll();
|
viewController.useROIController(roiController);
|
viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
|
|
viewController.addIconicVar(mImage);
|
viewController.repaint();
|
}
|
|
public LinePosition GetLinePosition()
|
{
|
LinePosition position;
|
int activeROIIdx = roiController.getActiveROIIdx();
|
if (activeROIIdx > -1)
|
{
|
ROI line = roiController.getActiveROI();
|
HTuple ss = line.getModelData();
|
if (ss.Length == 4)
|
{
|
position = new LinePosition(ss);
|
}
|
else
|
{
|
position = null;
|
}
|
}
|
else
|
{
|
position = null;
|
}
|
return position;
|
}
|
|
public CirclePosition GetCirClePosition()
|
{
|
CirclePosition position;
|
int activeROIIdx = roiController.getActiveROIIdx();
|
if (activeROIIdx > -1)
|
{
|
ROI circle = roiController.getActiveROI();
|
HTuple ss = circle.getModelData();
|
if (ss.Length == 3)
|
{
|
position = new CirclePosition(ss);
|
}
|
else
|
{
|
position = null;
|
}
|
}
|
else
|
{
|
position = null;
|
}
|
|
return position;
|
}
|
|
/// <summary>
|
/// 在指定窗体中显示Fit到的结果
|
/// </summary>
|
/// <param name="viewPort">图像显示窗体</param>
|
/// <param name="CurrentImg">图像</param>
|
/// <param name="result">匹配结果</param>
|
public void FitLineGraphics(HWndCtrl viewController, HImage CurrentImg, FitLineResult result)
|
{
|
//Window control that manages visualization
|
|
viewController.resetAll();
|
viewController.repaint();
|
|
viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
|
viewController.addIconicVar(CurrentImg);
|
HXLD DetectionContour = result.mFitLineResult;
|
if (DetectionContour != null)
|
{
|
viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
|
viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
|
viewController.addIconicVar(DetectionContour);
|
|
viewController.repaint();
|
}
|
}
|
|
public void FitCircleGraphics(HWndCtrl viewController, HImage CurrentImg, FitCircleResult result)
|
{
|
//Window control that manages visualization
|
|
viewController.resetAll();
|
viewController.repaint();
|
|
viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
|
viewController.addIconicVar(CurrentImg);
|
HXLD DetectionContour = result.mFitCircleResult;
|
if (DetectionContour != null)
|
{
|
viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
|
viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
|
viewController.addIconicVar(DetectionContour);
|
|
viewController.repaint();
|
}
|
}
|
|
public FitLineResult FitLine(FitLineParam param)
|
{
|
double t2, t1;
|
//HTuple hv_rows=null,hv_column=null;
|
FitLineResult result = new FitLineResult();
|
|
if (mImage == null)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE);
|
}
|
return result;
|
}
|
|
if (param == null)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET);
|
}
|
return result;
|
}
|
|
try
|
{
|
lock (someEventLock)
|
{
|
t1 = HSystem.CountSeconds();
|
|
mImage.GetImageSize(out result.mWidth,out result.mHeight);
|
HMetrologyModel hv_MetrologyHandle = new HMetrologyModel();
|
hv_MetrologyHandle.CreateMetrologyModel();
|
hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight);
|
hv_MetrologyHandle.AddMetrologyObjectLineMeasure((HTuple)param.hv_RowBegin, (HTuple)param.hv_ColumnBegin,
|
(HTuple)param.hv_RowEnd, (HTuple)param.hv_ColumnEnd, (HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2,
|
(HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold, new HTuple(), new HTuple());
|
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)(int)param.hv_measure_number);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString());
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString());
|
|
hv_MetrologyHandle.ApplyMetrologyModel(mImage);
|
|
result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns);
|
result.mContLine.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns);
|
result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398);
|
|
result.mContLine.FitLineContourXld("tukey", (int)(param.hv_measure_number - 10), 3, 5, 2.0,
|
out result.mRowStart, out result.mColumnStart, out result.mRowEnd, out result.mColumnEnd,
|
out result.mVector, out result.mNC, out result.mDist);
|
|
HTuple rows, cols;
|
|
rows = new HTuple(new HTuple[] { result.mRowStart, result.mRowEnd });
|
cols = new HTuple(new HTuple[] { result.mColumnStart, result.mColumnEnd });
|
|
result.mFitLineResult.GenContourPolygonXld(rows, cols);
|
|
//result.mAngle = result.mFitLineResult.GetContourAttribXld("angle");
|
|
//result.mAngle = result.mFitLineResult.GetContourAngleXld("abs", "range", 3);
|
|
t2 = HSystem.CountSeconds();
|
result.mTime = 1000.0 * (t2 - t1);
|
|
if (FitLineDone != null)
|
{
|
FitLineDone(this, mImage, result);
|
}
|
}
|
}
|
catch(HOperatorException e)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
//NotifyIconObserverMessage(FitAssistant.ERR_FITLINE);
|
}
|
result = null;
|
return result;
|
}
|
|
return result;
|
}
|
|
public FitCircleResult FitCircle(FitCircleParam param)
|
{
|
double t2, t1;
|
FitCircleResult result = new FitCircleResult();
|
|
if (mImage == null)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE);
|
}
|
return result;
|
}
|
|
if (param == null)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET);
|
}
|
return result;
|
}
|
|
try
|
{
|
lock (someEventLock)
|
{
|
t1 = HSystem.CountSeconds();
|
|
mImage.GetImageSize(out result.mWidth, out result.mHeight);
|
HMetrologyModel hv_MetrologyHandle = new HMetrologyModel();
|
hv_MetrologyHandle.CreateMetrologyModel();
|
hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight);
|
hv_MetrologyHandle.AddMetrologyObjectCircleMeasure((HTuple)param.hv_RowCenter, (HTuple)param.hv_ColumnCenter, (HTuple)param.hv_Radius,
|
(HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2, (HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold,
|
new HTuple(), new HTuple());
|
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)(int)param.hv_measure_number);
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString());
|
hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString());
|
|
hv_MetrologyHandle.ApplyMetrologyModel(mImage);
|
|
result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns);
|
result.mContCircle.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns);
|
result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398);
|
|
result.mContCircle.FitCircleContourXld("ahuber", -1, 2.0, 4, 3, 2.0,
|
out result.mRowCenter, out result.mColumnCenter, out result.mRadius,
|
out result.mStartPhi, out result.mEndPhi, out result.mPointOrder);
|
|
result.mFitCircleResult.GenCircleContourXld(result.mRowCenter, result.mColumnCenter, result.mRadius,
|
0, (new HTuple(360)).TupleRad(), (HTuple)"positive", 1.0);
|
|
t2 = HSystem.CountSeconds();
|
result.mTime = 1000.0 * (t2 - t1);
|
|
if (FitCircleDone != null)
|
{
|
FitCircleDone(this, mImage, result);
|
}
|
}
|
}
|
catch(HOperatorException e)
|
{
|
if (NotifyIconObserverMessage != null)
|
{
|
//NotifyIconObserverMessage(FitAssistant.ERR_FITCIRCLE);
|
}
|
result = null;
|
return result;
|
}
|
|
return result;
|
}
|
|
}
|
|
}
|