Halcon案例(三):C#联合Halcon识别排线
- 本案例分3部分
- 识别效果,分别显示识别前后识别后;
- 代码展示,分别是Halcon源码和Halcon转为C#的代码
- 代码解释(解释在源码中);
- 原图如下:
- 识别后图像如下:
- Halcon代码:
-
*关闭已经打开的窗口 dev_close_window ()*打开新窗口 dev_open_window (0, 0, 640, 480, 'black', WindowHandle)for i := 1 to 2 by 1*打开一张图像 read_image (Image, 'cable' + i)*获取一个三通道图像里的每个通道的图像数据decompose3 (Image, Red, Green, Blue)*将RGB三通道数据转化为HSV色彩空间的三通道图像数据trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')*对HSV图像中的饱和度通道进行阈值操作threshold (Saturation, HighSaturation, 100, 255)*获取上述阈值操作后区域中的色调通道图像数据reduce_domain (Hue, HighSaturation, HueHighSaturation)*对上述色调通道图像数据进行阈值处理threshold (HueHighSaturation, Yellow, 20, 50)*获取区域里连接的组件connection (Yellow, ConnectedRegions)*保留ConnectedRegions里的最大的区域select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)*对SelectedRegions进行闭运算操作closing_circle (SelectedRegions, Yellow, 3.5)*将Yellow区域里的图像剪切出来reduce_domain (Image, Yellow, ImageReduced)*显示图像dev_clear_window()dev_set_color ('white')dev_set_draw ('margin')*显示黄色的电线dev_display (Image)dev_display (Yellow)stop () endfor
- C#代码 :
-
#region 识别排线中的黄色的线束 public void RecognizeLine(HTuple winId, string imagePath) {// Local iconic variables HObject ho_Image = null, ho_Red = null, ho_Green = null;HObject ho_Blue = null, ho_Hue = null, ho_Saturation = null, ho_Intensity = null;HObject ho_HighSaturation = null, ho_HueHighSaturation = null;HObject ho_Yellow = null, ho_ConnectedRegions = null, ho_SelectedRegions = null;HObject ho_ImageReduced = null;// Local control variables HTuple hv_WindowHandle = new HTuple(), hv_i = new HTuple();// Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image);HOperatorSet.GenEmptyObj(out ho_Red);HOperatorSet.GenEmptyObj(out ho_Green);HOperatorSet.GenEmptyObj(out ho_Blue);HOperatorSet.GenEmptyObj(out ho_Hue);HOperatorSet.GenEmptyObj(out ho_Saturation);HOperatorSet.GenEmptyObj(out ho_Intensity);HOperatorSet.GenEmptyObj(out ho_HighSaturation);HOperatorSet.GenEmptyObj(out ho_HueHighSaturation);HOperatorSet.GenEmptyObj(out ho_Yellow);HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);HOperatorSet.GenEmptyObj(out ho_SelectedRegions);HOperatorSet.GenEmptyObj(out ho_ImageReduced);//关闭已经打开的窗口//if (HDevWindowStack.IsOpen())//{// HOperatorSet.CloseWindow(HDevWindowStack.Pop());//}//打开新窗口//HOperatorSet.SetWindowAttr("background_color", "black");//HOperatorSet.OpenWindow(0, 0, 640, 480, 0, "visible", "", out hv_WindowHandle);//HDevWindowStack.Push(hv_WindowHandle);//for (hv_i = 1; (int)hv_i <= 2; hv_i = (int)hv_i + 1){//打开一张图像//using (HDevDisposeHelper dh = new HDevDisposeHelper())//{// ho_Image.Dispose();// HOperatorSet.ReadImage(out ho_Image, "cable" + hv_i);//}HOperatorSet.ReadImage(out ho_Image, imagePath);//获取一个三通道图像里的每个通道的图像数据ho_Red.Dispose(); ho_Green.Dispose(); ho_Blue.Dispose();HOperatorSet.Decompose3(ho_Image, out ho_Red, out ho_Green, out ho_Blue);//将RGB三通道数据转化为HSV色彩空间的三通道图像数据ho_Hue.Dispose(); ho_Saturation.Dispose(); ho_Intensity.Dispose();HOperatorSet.TransFromRgb(ho_Red, ho_Green, ho_Blue, out ho_Hue, out ho_Saturation,out ho_Intensity, "hsv");//对HSV图像中的饱和度通道进行阈值操作ho_HighSaturation.Dispose();HOperatorSet.Threshold(ho_Saturation, out ho_HighSaturation, 100, 255);//获取上述阈值操作后区域中的色调通道图像数据ho_HueHighSaturation.Dispose();HOperatorSet.ReduceDomain(ho_Hue, ho_HighSaturation, out ho_HueHighSaturation);//对上述色调通道图像数据进行阈值处理ho_Yellow.Dispose();HOperatorSet.Threshold(ho_HueHighSaturation, out ho_Yellow, 20, 50);//获取区域里连接的组件ho_ConnectedRegions.Dispose();HOperatorSet.Connection(ho_Yellow, out ho_ConnectedRegions);//保留ConnectedRegions里的最大的区域ho_SelectedRegions.Dispose();HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area",0);//对SelectedRegions进行闭运算操作ho_Yellow.Dispose();HOperatorSet.ClosingCircle(ho_SelectedRegions, out ho_Yellow, 3.5);//将Yellow区域里的图像剪切出来ho_ImageReduced.Dispose();HOperatorSet.ReduceDomain(ho_Image, ho_Yellow, out ho_ImageReduced);//显示图像//if (HDevWindowStack.IsOpen()){HOperatorSet.ClearWindow(winId);}//if (HDevWindowStack.IsOpen()){HOperatorSet.SetColor(winId, "white");}//if (HDevWindowStack.IsOpen()){HOperatorSet.SetDraw(winId, "margin");}//显示黄色的电线//if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Image, winId);}//if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Yellow, winId);}// stop(...); only in hdevelop}ho_Image.Dispose();ho_Red.Dispose();ho_Green.Dispose();ho_Blue.Dispose();ho_Hue.Dispose();ho_Saturation.Dispose();ho_Intensity.Dispose();ho_HighSaturation.Dispose();ho_HueHighSaturation.Dispose();ho_Yellow.Dispose();ho_ConnectedRegions.Dispose();ho_SelectedRegions.Dispose();ho_ImageReduced.Dispose();hv_WindowHandle.Dispose();hv_i.Dispose();} #endregion