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);
}
}
}
}