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;
|
|
/// <summary>HALCON image used for .</summary>
|
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;
|
}
|
|
/// <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.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;
|
}
|
|
/// <summary>
|
/// 二值化图像
|
/// </summary>
|
/// <param name="image">图像</param>
|
/// <returns></returns>
|
public HObject ThresholdObj(HImage image)
|
{
|
HObject tmpObj;
|
HOperatorSet.GenEmptyObj(out tmpObj);
|
tmpObj.Dispose();
|
|
HOperatorSet.Threshold(image, out tmpObj, mContourPara.ThresholdMin, mContourPara.ThresholdMax);
|
|
return tmpObj;
|
}
|
|
/// <summary>
|
/// 根据面积剔除物体
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 根据序号选择物体
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
|
}
|
}
|