- 本案例分3部分
- 识别效果,分别显示识别前后识别后;
- 代码展示,分别是Halcon源码和Halcon转为C#的代码
- 代码解释(解释在源码中)
- 原图如下:


*读取一张图像
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|)
/// <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");//}//产生矩形ROIho_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();}