cs
复制代码
*读取一张图像
read_image (Image, 'progres')
*获取图像大小
get_image_size (Image, Width, Height)
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowID)
*显示图像
dev_display (Image)
*设置输出对象的颜色,对象是指区域,XLD,其它几何对象
dev_set_color ('red')
*设置区域填充方式
dev_set_draw ('margin')
*产生矩形ROI
gen_rectangle1 (Rectangle, 260, 90, 360, 350)
*减少图像区域
reduce_domain (Image, Rectangle, ImageReduced)
*固定阈值
threshold (ImageReduced, Dark, 0, 150)
*计算区域里的连通域
connection (Dark, ConnectedRegions)
*根据面积大小来过滤区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 100)
*获取区域等效椭圆的参数
elliptic_axis (SelectedRegions, Ra, Rb, Phi)
*获取区域的面积和中心坐标
area_center (SelectedRegions, Area, Row, Column)
*显示图像
dev_display (Image)
*设置输出对象的颜色
dev_set_color ('green')
*显示区域
dev_display (SelectedRegions)
*计算区域平均半径
MeanRadius := sum(Ra) / |Ra|
*计算半径的方差,方差描述随机变量对于数学期望的偏离程度.
VarianceRadius := sum((Ra - MeanRadius)*(Ra - MeanRadius)) / (|Ra|)
cs
复制代码
/// <summary>
/// 识别图像中散热孔
/// </summary>
/// <param name="winId">窗体的句柄(HSmartWindowControlWPF的HalconWindow属性)</param>
/// <param name="imagePath">图像路径</param>
public static void RecognizeHoleOfBox(HTuple winId, string imagePath)
{
// Local iconic variables
HObject ho_Image, ho_Rectangle, ho_ImageReduced;
HObject ho_Dark, ho_ConnectedRegions, ho_SelectedRegions;
// Local control variables
HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
HTuple hv_Ra = new HTuple();
HTuple hv_Rb = new HTuple(), hv_Phi = new HTuple(), hv_Area = new HTuple();
HTuple hv_Row = new HTuple(), hv_Column = new HTuple();
HTuple hv_MeanRadius = new HTuple(), hv_VarianceRadius = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.GenEmptyObj(out ho_Rectangle);
HOperatorSet.GenEmptyObj(out ho_ImageReduced);
HOperatorSet.GenEmptyObj(out ho_Dark);
HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
//读取一张图像
ho_Image.Dispose();
HOperatorSet.ReadImage(out ho_Image, imagePath);
//获取图像大小
hv_Width.Dispose();
hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
//关闭窗口
//if (HDevWindowStack.IsOpen())
//{
// HOperatorSet.CloseWindow(HDevWindowStack.Pop());
//}
//打开窗口
//HOperatorSet.SetWindowAttr("background_color", "black");
//HOperatorSet.OpenWindow(0, 0, hv_Width, hv_Height, 0, "visible", "", out hv_WindowID);
//HDevWindowStack.Push(hv_WindowID);
//显示图像
//if (HDevWindowStack.IsOpen())
//{
// HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
//}
//设置输出对象的颜色,对象是指区域,XLD,其它几何对象
//if (HDevWindowStack.IsOpen())
//{
// HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
//}
//设置区域填充方式
//if (HDevWindowStack.IsOpen())
//{
// HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");
//}
//产生矩形ROI
ho_Rectangle.Dispose();
HOperatorSet.GenRectangle1(out ho_Rectangle, 260, 90, 360, 350);
//减少图像区域
ho_ImageReduced.Dispose();
HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
//固定阈值
ho_Dark.Dispose();
HOperatorSet.Threshold(ho_ImageReduced, out ho_Dark, 0, 150);
//计算区域里的连通域
ho_ConnectedRegions.Dispose();
HOperatorSet.Connection(ho_Dark, out ho_ConnectedRegions);
//根据面积大小来过滤区域
ho_SelectedRegions.Dispose();
HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
"and", 10, 100);
//获取区域等效椭圆的参数
hv_Ra.Dispose(); hv_Rb.Dispose(); hv_Phi.Dispose();
HOperatorSet.EllipticAxis(ho_SelectedRegions, out hv_Ra, out hv_Rb, out hv_Phi);
//获取区域的面积和中心坐标
hv_Area.Dispose(); hv_Row.Dispose(); hv_Column.Dispose();
HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area, out hv_Row, out hv_Column);
//显示图像
//if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Image, winId);
}
//设置输出对象的颜色
//if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetColor(winId, "green");
}
//显示区域
//if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_SelectedRegions, winId);
}
//计算区域平均半径
hv_MeanRadius.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_MeanRadius = (hv_Ra.TupleSum()
) / (new HTuple(hv_Ra.TupleLength()));
}
//计算半径的方差,方差描述随机变量对于数学期望的偏离程度.
hv_VarianceRadius.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_VarianceRadius = ((((hv_Ra - hv_MeanRadius) * (hv_Ra - hv_MeanRadius))).TupleSum()
) / (new HTuple(hv_Ra.TupleLength()));
}
ho_Image.Dispose();
ho_Rectangle.Dispose();
ho_ImageReduced.Dispose();
ho_Dark.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
hv_Width.Dispose();
hv_Height.Dispose();
//hv_WindowID.Dispose();
hv_Ra.Dispose();
hv_Rb.Dispose();
hv_Phi.Dispose();
hv_Area.Dispose();
hv_Row.Dispose();
hv_Column.Dispose();
hv_MeanRadius.Dispose();
hv_VarianceRadius.Dispose();
}