public ResultLinesDotsPosNegInspect DealLinesDotsPosNegInspect(ParLinesDotsPosNegInspect par, Hashtable htResult, Hashtable htResult_Mult) { #region 定义 ResultLinesDotsPosNegInspect result = new ResultLinesDotsPosNegInspect(); HTuple width = 0; HTuple height = 0; HObject ho_Image = null; HObject ho_ReduceImage = null; HObject ho_ResultPreprocess = null; HObject ho_ROI = null; HObject ho_ROIPreprocess = null; HObject ho_ImageDesReduce = null; HObject ho_MultiChannelImage = null; HObject ho_MultiChannelEdges = null;//多通道边缘显示图像 HOperatorSet.GenEmptyObj(out ho_ResultPreprocess); HOperatorSet.GenEmptyObj(out ho_ReduceImage); HOperatorSet.GenEmptyObj(out ho_ImageDesReduce); HOperatorSet.GenEmptyObj(out ho_MultiChannelImage); HOperatorSet.GenEmptyObj(out ho_MultiChannelEdges); #endregion 定义 try { #region 基础功能调用 if (BasicImageProcess_MultROI(par, result, htResult, out ho_ROI, out ho_ReduceImage, out ho_Image, out width, out height)) { } else { return(result); } #endregion 基础功能调用 HObject ho_AffineROI = result.g_ResultPreProcess.resultAffineImage.ImageROIAffine.Ho_Image; //TODO 获取ROI 预处理之后的ROITrans ho_ROIPreprocess = ho_ROI; //多相机引用 int noCamera = par.NoCameraMult; Hashtable htResult_Camera = htResult_Mult["HtResult_Cam" + noCamera.ToString()] as Hashtable; ResultPhoto photo = htResult_Camera[par.CellRefImage_Mult.NameCell] as ResultPhoto; ImageAll imMult = photo.HtResultImage[par.CellRefImage_Mult.NameCell + "FunPhoto.CameraImage"] as ImageAll; //获取图像预处理结果--经过投影变换出来的结果 ho_ResultPreprocess = result.g_ResultPreProcess.ImageResult.Ho_Image; //目标相机拍摄的图像也进行区域reduce ho_ImageDesReduce.Dispose(); HOperatorSet.ReduceDomain(imMult.Ho_Image, ho_ROIPreprocess, out ho_ImageDesReduce); //求融合图像 ho_MultiChannelImage.Dispose(); bool blInspectResult = LinesDotsPosNegInspect(ho_ImageDesReduce, ho_ResultPreprocess, par, result, out ho_MultiChannelImage); ho_MultiChannelEdges.Dispose(); bool blCalibConfirm = CalibConfirm(ho_ROIPreprocess, ho_ImageDesReduce, ho_ResultPreprocess, par, result, width, height, out ho_MultiChannelEdges); //求融合图像 //ho_MultiChannelImage.Dispose(); //bool blInspectResult = LinesDotsPosNegInspect(imMult.Ho_Image, ho_ResultPreprocess, par, result, out ho_MultiChannelImage); //ho_MultiChannelEdges.Dispose(); //bool blCalibConfirm = CalibConfirm(ho_ROIPreprocess, imMult.Ho_Image, ho_ResultPreprocess, par, result, width, height, out ho_MultiChannelEdges); if (blInspectResult) { result.LevelError_e = LevelError_enum.Error; result.TypeErrorProcess_e = TypeErrorProcess_enum.Others; result.Annotation = par.NameCell.ToString() + ",点线区域求取错误!"; return(result); } //TODO 融合之后的图像赋值 return(result); } catch (Exception ex) { result.LevelError_e = LevelError_enum.Error; result.TypeErrorProcess_e = TypeErrorProcess_enum.Catch; result.Annotation = par.NameCell.ToString() + ",点线区域求取跳转到异常"; result.SetDefault(); LogError("FunLinesDotsPosNegInspect", par, ex); return(result); } finally { //对结果进行综合处理 SetComprehensiveResult(result, par, htResult, true); //校准 DealCalibResult(par, result, htResult); #region 记录时间 WriteRunTime(stopWatch, NameClass, par, result); #endregion 记录时间 #region 记录 RecordImage(par, result, NameClass, "ReduceImage", ho_ReduceImage); //保存图像到哈希表 RecordImage(par, result, NameClass, "ImageDesReduce", ho_ImageDesReduce); //保存图像到哈希表 RecordImage_Record(par, result, NameClass, "MultiChannelImage", ho_MultiChannelImage); RecordImage_Record(par, result, NameClass, "MultiChannelEdges", ho_MultiChannelEdges); #endregion 记录 } }
/// <summary> /// 投影变换重合度校验 /// </summary> /// <param name="ho_Rectangle">异物检测的ROI</param> /// <param name="ho_ImageZ">正视图</param> /// <param name="ho_ImageC">侧视图</param> /// <param name="par"></param> /// <param name="result"></param> /// <param name="hv_Width"></param> /// <param name="hv_Height"></param> /// <param name="ho_MultiChannelEdges">边缘融合图像</param> /// <returns></returns> bool CalibConfirm(HObject ho_Rectangle, HObject ho_ImageZ, HObject ho_ImageC, ParLinesDotsPosNegInspect par, ResultLinesDotsPosNegInspect result, HTuple hv_Width, HTuple hv_Height, out HObject ho_MultiChannelEdges) { HObject ho_RegionDilation = null, ho_ImageReducedZWorkD = null; HObject ho_ImageReducedCTWorkD = null, ho_CameraZWorkRD = null; HObject ho_CameraZWorkGD = null, ho_CameraZWorkBD = null, ho_CameraCTWorkRD = null; HObject ho_CameraCTWorkGD = null, ho_CameraCTWorkBD = null; HObject ho_EdgesCTD = null, ho_EdgesZD = null, ho_RegionCTD = null; HObject ho_RegionZD = null, ho_ImageZconst = null, ho_ImageCTconst = null; HOperatorSet.GenEmptyObj(out ho_RegionDilation); HOperatorSet.GenEmptyObj(out ho_ImageReducedZWorkD); HOperatorSet.GenEmptyObj(out ho_ImageReducedCTWorkD); HOperatorSet.GenEmptyObj(out ho_CameraZWorkRD); HOperatorSet.GenEmptyObj(out ho_CameraZWorkGD); HOperatorSet.GenEmptyObj(out ho_CameraZWorkBD); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkRD); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkGD); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkBD); HOperatorSet.GenEmptyObj(out ho_EdgesCTD); HOperatorSet.GenEmptyObj(out ho_EdgesZD); HOperatorSet.GenEmptyObj(out ho_RegionCTD); HOperatorSet.GenEmptyObj(out ho_RegionZD); HOperatorSet.GenEmptyObj(out ho_ImageZconst); HOperatorSet.GenEmptyObj(out ho_ImageCTconst); HOperatorSet.GenEmptyObj(out ho_MultiChannelEdges); try { ho_RegionDilation.Dispose(); HOperatorSet.DilationRectangle1(ho_Rectangle, out ho_RegionDilation, 600, 100); ho_ImageReducedZWorkD.Dispose(); HOperatorSet.ReduceDomain(ho_ImageZ, ho_RegionDilation, out ho_ImageReducedZWorkD); ho_ImageReducedCTWorkD.Dispose(); HOperatorSet.ReduceDomain(ho_ImageC, ho_RegionDilation, out ho_ImageReducedCTWorkD); ho_CameraZWorkRD.Dispose(); ho_CameraZWorkGD.Dispose(); ho_CameraZWorkBD.Dispose(); HOperatorSet.Decompose3(ho_ImageReducedZWorkD, out ho_CameraZWorkRD, out ho_CameraZWorkGD, out ho_CameraZWorkBD); ho_CameraCTWorkRD.Dispose(); ho_CameraCTWorkGD.Dispose(); ho_CameraCTWorkBD.Dispose(); HOperatorSet.Decompose3(ho_ImageReducedCTWorkD, out ho_CameraCTWorkRD, out ho_CameraCTWorkGD, out ho_CameraCTWorkBD); ho_EdgesCTD.Dispose(); HOperatorSet.EdgesSubPix(ho_CameraCTWorkGD, out ho_EdgesCTD, "canny", 1, 10, 30); ho_EdgesZD.Dispose(); HOperatorSet.EdgesSubPix(ho_CameraZWorkGD, out ho_EdgesZD, "canny", 1, 10, 30); ho_RegionCTD.Dispose(); HOperatorSet.GenRegionContourXld(ho_EdgesCTD, out ho_RegionCTD, "margin"); ho_RegionZD.Dispose(); HOperatorSet.GenRegionContourXld(ho_EdgesZD, out ho_RegionZD, "margin"); ho_ImageZconst.Dispose(); HOperatorSet.GenImageConst(out ho_ImageZconst, "byte", hv_Width, hv_Height); ho_ImageCTconst.Dispose(); HOperatorSet.GenImageConst(out ho_ImageCTconst, "byte", hv_Width, hv_Height); { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_RegionZD, ho_ImageZconst, out ExpTmpOutVar_0, 255, "margin"); ho_ImageZconst.Dispose(); ho_ImageZconst = ExpTmpOutVar_0; } { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_RegionCTD, ho_ImageCTconst, out ExpTmpOutVar_0, 255, "margin"); ho_ImageCTconst.Dispose(); ho_ImageCTconst = ExpTmpOutVar_0; } ho_MultiChannelEdges.Dispose(); HOperatorSet.Compose3(ho_ImageCTconst, ho_ImageZconst, ho_ImageZconst, out ho_MultiChannelEdges); return(true); } catch (Exception ex) { LogError("FunLinesDotsPosNegInspect", ex); return(false); } finally { //记录 RecordHoject(par, result, NameClass, "RegionDilation", ho_RegionDilation); RecordHoject(par, result, NameClass, "ImageReducedZWorkD", ho_ImageReducedZWorkD); RecordHoject(par, result, NameClass, "ImageReducedCTWorkD", ho_ImageReducedCTWorkD); RecordHoject(par, result, NameClass, "EdgesCTD", ho_EdgesCTD); RecordHoject(par, result, NameClass, "EdgesZD", ho_EdgesZD); RecordHoject(par, result, NameClass, "RegionCTD", ho_RegionCTD); RecordHoject(par, result, NameClass, "RegionZD", ho_RegionZD); //RecordHoject(par, result, NameClass, "MultiChannelEdges", ho_MultiChannelEdges); //释放资源 if (ho_CameraZWorkRD != null) { ho_CameraZWorkRD.Dispose(); } if (ho_CameraZWorkGD != null) { ho_CameraZWorkGD.Dispose(); } if (ho_CameraZWorkBD != null) { ho_CameraZWorkBD.Dispose(); } if (ho_CameraCTWorkRD != null) { ho_CameraCTWorkRD.Dispose(); } if (ho_CameraCTWorkGD != null) { ho_CameraCTWorkGD.Dispose(); } if (ho_CameraCTWorkBD != null) { ho_CameraCTWorkBD.Dispose(); } if (ho_ImageZconst != null) { ho_ImageZconst.Dispose(); } if (ho_ImageCTconst != null) { ho_ImageCTconst.Dispose(); } } }
/// <summary> /// 传入正视和侧视的两幅图片,提取出其中一面的缺陷,返回缺陷区域和融合图片 /// </summary> /// <param name="ho_ImageZ">经过ROI reduce以后的正视图片</param> /// <param name="ho_ImageC">经过ROI reduce以后的侧视图片</param> /// <param name="ho_LNgRegions">点缺陷区域</param> /// <param name="ho_PNgRegions">线缺陷区域</param> /// <param name="ho_MultiChannelImage">正侧视融合图像</param> /// <returns></returns> bool LinesDotsPosNegInspect(HObject ho_ImageZ, HObject ho_ImageC, ParLinesDotsPosNegInspect par, ResultLinesDotsPosNegInspect result, out HObject ho_MultiChannelImage) { //是否有线状异物 bool blLNg = false; //是否有点状异物 bool blPNg = false; HObject ho_PNgRegions = null, ho_LNgRegions = null; HObject ho_CameraZWorkR = null, ho_CameraZWorkG = null, ho_CameraZWorkB = null; HObject ho_CameraCTWorkR = null, ho_CameraCTWorkG = null, ho_CameraCTWorkB = null; HObject ho_OutputRegionsZSizeSelP, ho_OutputRegionsCSizeSelP, ho_OutputRegionsZSizeSelL, ho_OutputRegionsCSizeSelL; HObject ho_ZLSelectedRegions, ho_CTLSelectedRegions, ho_ZPSelectedRegions, ho_CTPSelectedRegions; HObject ho_RectangleZLSearch = null, ho_RectangleZPSearch = null; HObject ho_DestRegions = null; HObject ho_CTPObjectSelected = null, ho_CTLObjectSelected = null; HTuple hv_CameraZPArea = new HTuple(); HTuple hv_CameraZPRow = new HTuple(), hv_CameraZPColumn = new HTuple(); HTuple hv_CameraCTPArea = new HTuple(), hv_CameraCTPRow = new HTuple(); HTuple hv_CameraCTPColumn = new HTuple(), hv_CameraZLArea = new HTuple(); HTuple hv_CameraZLRow = new HTuple(), hv_CameraZLColumn = new HTuple(); HTuple hv_CameraCTLArea = new HTuple(), hv_CameraCTLRow = new HTuple(); HTuple hv_CameraCTLColumn = new HTuple(); HTuple hv_NumberCTP = new HTuple(), hv_NumberZP = new HTuple(); HTuple hv_NumberCTL = new HTuple(), hv_NumberZL = new HTuple(); HTuple hv_NumberNG = new HTuple(); HTuple hv_NumberLNgRegions = new HTuple(), hv_NumberPNgRegions = new HTuple(); HTuple hv_PNgArea = new HTuple(), hv_PNgRow = new HTuple(), hv_PNgColumn = new HTuple(); HTuple hv_PNgRow2 = new HTuple(), hv_PNgColumn2 = new HTuple(); HTuple hv_LNgArea = new HTuple(), hv_LNgRow = new HTuple(), hv_LNgColumn = new HTuple(); HTuple hv_LNgRow2 = new HTuple(), hv_LNgColumn2 = new HTuple(); HOperatorSet.GenEmptyObj(out ho_CameraZWorkR); HOperatorSet.GenEmptyObj(out ho_CameraZWorkG); HOperatorSet.GenEmptyObj(out ho_CameraZWorkB); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkR); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkG); HOperatorSet.GenEmptyObj(out ho_CameraCTWorkB); HOperatorSet.GenEmptyObj(out ho_MultiChannelImage); HOperatorSet.GenEmptyObj(out ho_OutputRegionsZSizeSelP); HOperatorSet.GenEmptyObj(out ho_OutputRegionsCSizeSelP); HOperatorSet.GenEmptyObj(out ho_OutputRegionsZSizeSelL); HOperatorSet.GenEmptyObj(out ho_OutputRegionsCSizeSelL); HOperatorSet.GenEmptyObj(out ho_ZLSelectedRegions); HOperatorSet.GenEmptyObj(out ho_CTLSelectedRegions); HOperatorSet.GenEmptyObj(out ho_ZPSelectedRegions); HOperatorSet.GenEmptyObj(out ho_CTPSelectedRegions); HOperatorSet.GenEmptyObj(out ho_PNgRegions); HOperatorSet.GenEmptyObj(out ho_LNgRegions); HOperatorSet.GenEmptyObj(out ho_RectangleZPSearch); HOperatorSet.GenEmptyObj(out ho_RectangleZLSearch); HOperatorSet.GenEmptyObj(out ho_DestRegions); HOperatorSet.GenEmptyObj(out ho_CTPObjectSelected); HOperatorSet.GenEmptyObj(out ho_CTLObjectSelected); try { //彩色图像分解 ho_CameraZWorkR.Dispose(); ho_CameraZWorkG.Dispose(); ho_CameraZWorkB.Dispose(); HOperatorSet.Decompose3(ho_ImageZ, out ho_CameraZWorkR, out ho_CameraZWorkG, out ho_CameraZWorkB); ho_CameraCTWorkR.Dispose(); ho_CameraCTWorkG.Dispose(); ho_CameraCTWorkB.Dispose(); HOperatorSet.Decompose3(ho_ImageC, out ho_CameraCTWorkR, out ho_CameraCTWorkG, out ho_CameraCTWorkB); //查看图片时,红色缺陷在左侧的为OK片,红色缺陷在右侧(或者重合,偏差很小的时候)的为NG片 ho_MultiChannelImage.Dispose(); HOperatorSet.Compose3(ho_CameraCTWorkR, ho_CameraZWorkR, ho_CameraZWorkR, out ho_MultiChannelImage); //正视相机点缺陷提取 ho_OutputRegionsZSizeSelP.Dispose(); MyTh(ho_CameraZWorkR, out ho_OutputRegionsZSizeSelP, par.DotsTh, par.ClosingRadius, par.OpeningRadius, par.SizeTh); //侧视相机点缺陷提取 ho_OutputRegionsCSizeSelP.Dispose(); MyTh(ho_CameraCTWorkR, out ho_OutputRegionsCSizeSelP, par.DotsTh, par.ClosingRadius, par.OpeningRadius, par.SizeTh); //正视相机线缺陷提取 ho_OutputRegionsZSizeSelL.Dispose(); MyTh(ho_CameraZWorkR, out ho_OutputRegionsZSizeSelL, par.LinesTh, par.ClosingRadius, par.OpeningRadius, par.SizeTh); //侧视相机线缺陷提取 ho_OutputRegionsCSizeSelL.Dispose(); MyTh(ho_CameraCTWorkR, out ho_OutputRegionsCSizeSelL, par.LinesTh, par.ClosingRadius, par.OpeningRadius, par.SizeTh); //分离出线状区域 ho_ZLSelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_OutputRegionsZSizeSelL, out ho_ZLSelectedRegions, "compactness", "and", par.DotsLinesSeperateTh + 0.00001, 9999); ho_CTLSelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_OutputRegionsCSizeSelL, out ho_CTLSelectedRegions, "compactness", "and", par.DotsLinesSeperateTh + 0.00001, 9999); //分离出点状区域 ho_ZPSelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_OutputRegionsZSizeSelP, out ho_ZPSelectedRegions, "compactness", "and", 1, par.DotsLinesSeperateTh); ho_CTPSelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_OutputRegionsCSizeSelP, out ho_CTPSelectedRegions, "compactness", "and", 1, par.DotsLinesSeperateTh); HOperatorSet.AreaCenter(ho_ZPSelectedRegions, out hv_CameraZPArea, out hv_CameraZPRow, out hv_CameraZPColumn); HOperatorSet.AreaCenter(ho_CTPSelectedRegions, out hv_CameraCTPArea, out hv_CameraCTPRow, out hv_CameraCTPColumn); HOperatorSet.AreaCenter(ho_ZLSelectedRegions, out hv_CameraZLArea, out hv_CameraZLRow, out hv_CameraZLColumn); HOperatorSet.AreaCenter(ho_CTLSelectedRegions, out hv_CameraCTLArea, out hv_CameraCTLRow, out hv_CameraCTLColumn); //判断两幅图中是否存在相关联的区域 //实际搜索的时候,可能需要增加三个选项 //1-从左向右搜索还是从右向左搜索 //2-是搜索OK区域还是NG区域 //3-搜索到的对应区域点位是否需要删除 //生成搜索区域 ho_PNgRegions.Dispose(); HOperatorSet.GenEmptyObj(out ho_PNgRegions); HOperatorSet.TupleLength(hv_CameraCTPRow, out hv_NumberCTP); HOperatorSet.TupleLength(hv_CameraZPRow, out hv_NumberZP); HOperatorSet.TupleLength(hv_CameraCTLRow, out hv_NumberCTL); HOperatorSet.TupleLength(hv_CameraZLRow, out hv_NumberZL); //确定点状缺陷 if (hv_NumberCTP.I != 0 && hv_NumberZP != 0) { ho_RectangleZPSearch.Dispose(); HOperatorSet.GenRectangle1(out ho_RectangleZPSearch, hv_CameraZPRow - par.UpExtend, hv_CameraZPColumn - par.LeftExtend, hv_CameraZPRow + par.DownExtend, hv_CameraZPColumn + par.RightExtend); for (int i = 0; i < hv_NumberCTP.I; i++) { //这里还需要处理含有某个点可能落在多个区域中的情况 ho_DestRegions.Dispose(); //Choose all regions containing a given pixel. HOperatorSet.SelectRegionPoint(ho_RectangleZPSearch, out ho_DestRegions, hv_CameraCTPRow.TupleSelect(i), hv_CameraCTPColumn.TupleSelect(i)); HOperatorSet.CountObj(ho_DestRegions, out hv_NumberNG); if (hv_NumberNG.I != 0) { //concat_obj (DestRegions, NgRegions, NgRegions) ho_CTPObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_CTPSelectedRegions, out ho_CTPObjectSelected, i + 1); { HObject ExpTmpOutVar_0; HOperatorSet.ConcatObj(ho_CTPObjectSelected, ho_PNgRegions, out ExpTmpOutVar_0); ho_PNgRegions.Dispose(); ho_PNgRegions = ExpTmpOutVar_0; } } } blPNg = true;//找到点状异物 GetNgRegionPar(ho_PNgRegions, out hv_PNgArea, out hv_PNgRow, out hv_PNgColumn, out hv_PNgRow2, out hv_PNgColumn2); for (int i = 0; i < hv_PNgRow.Length; i++) { double x = (hv_PNgColumn.D + hv_PNgColumn2.D) / 2; double y = (hv_PNgRow.D + hv_PNgRow2.D) / 2; double height = hv_PNgRow2.D - hv_PNgRow.D; double width = hv_PNgColumn2.D - hv_PNgColumn.D; result.X_L.Add(x);//添加进所有异物列表 result.Y_L.Add(y); result.R_L.Add(0); result.Height_L.Add(height); result.Width_L.Add(width); result.XPNg_L.Add(x);//添加进点状异物列表 result.YPNg_L.Add(y); result.blPNg = blPNg; } } //确定线状缺陷 if (hv_NumberCTL.I != 0 && hv_NumberZL != 0) { ho_RectangleZLSearch.Dispose(); HOperatorSet.GenRectangle1(out ho_RectangleZLSearch, hv_CameraZLRow - par.UpExtend, hv_CameraZLColumn - par.LeftExtend, hv_CameraZLRow + par.DownExtend, hv_CameraZLColumn + par.RightExtend); for (int i = 0; i < hv_NumberCTL.I; i++) { //这里还需要处理含有某个点可能落在多个区域中的情况 ho_DestRegions.Dispose(); //Choose all regions containing a given pixel. HOperatorSet.SelectRegionPoint(ho_RectangleZLSearch, out ho_DestRegions, hv_CameraCTLRow.TupleSelect(i), hv_CameraCTLColumn.TupleSelect(i)); HOperatorSet.CountObj(ho_DestRegions, out hv_NumberNG); if (hv_NumberNG.I != 0) { ho_CTLObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_CTLObjectSelected, out ho_CTLObjectSelected, i + 1); { HObject ExpTmpOutVar_0; HOperatorSet.ConcatObj(ho_CTLObjectSelected, ho_LNgRegions, out ExpTmpOutVar_0); ho_LNgRegions.Dispose(); ho_LNgRegions = ExpTmpOutVar_0; } } } blLNg = true; //找到线状异物 GetNgRegionPar(ho_LNgRegions, out hv_LNgArea, out hv_LNgRow, out hv_LNgColumn, out hv_LNgRow2, out hv_LNgColumn2); for (int i = 0; i < hv_LNgRow.Length; i++) { double x = (hv_LNgColumn.D + hv_LNgColumn2.D) / 2; double y = (hv_LNgRow.D + hv_LNgRow2.D) / 2; double height = hv_LNgRow2.D - hv_LNgRow.D; double width = hv_LNgColumn2.D - hv_LNgColumn.D; result.X_L.Add(x);//添加进所有异物列表 result.Y_L.Add(y); result.R_L.Add(0); result.Height_L.Add(height); result.Width_L.Add(width); result.XLNg_L.Add(x);//添加进点状异物列表 result.YLNg_L.Add(y); result.blLNg = blLNg; } } result.Num = result.X_L.Count; if (result.Num == 0) { result.LevelError_e = LevelError_enum.OK; result.Annotation = par.NameCell.ToString() + "未发现点线异常!"; result.SetDefault(); } return(true); } catch (Exception ex) { Log.L_I.WriteError(NameClass, ex); return(false); } finally { #region 记录 RecordHoject(par, result, NameClass, "PNgRegions", ho_PNgRegions); RecordHoject(par, result, NameClass, "LNgRegions", ho_LNgRegions); RecordHoject(par, result, NameClass, "CameraZWorkR", ho_CameraZWorkR); RecordHoject(par, result, NameClass, "CameraZWorkG", ho_CameraZWorkG); RecordHoject(par, result, NameClass, "CameraZWorkB", ho_CameraZWorkB); RecordHoject(par, result, NameClass, "CameraCTWorkR", ho_CameraCTWorkR); RecordHoject(par, result, NameClass, "CameraCTWorkG", ho_CameraCTWorkG); RecordHoject(par, result, NameClass, "CameraCTWorkB", ho_CameraCTWorkB); RecordHoject(par, result, NameClass, "OutputRegionsZSizeSelP", ho_OutputRegionsZSizeSelP); RecordHoject(par, result, NameClass, "OutputRegionsCSizeSelP", ho_OutputRegionsCSizeSelP); RecordHoject(par, result, NameClass, "OutputRegionsZSizeSelL", ho_OutputRegionsZSizeSelL); RecordHoject(par, result, NameClass, "OutputRegionsCSizeSelL", ho_OutputRegionsCSizeSelL); RecordHoject(par, result, NameClass, "ZLSelectedRegions", ho_ZLSelectedRegions); RecordHoject(par, result, NameClass, "CTLSelectedRegions", ho_CTLSelectedRegions); RecordHoject(par, result, NameClass, "ZPSelectedRegions", ho_ZPSelectedRegions); RecordHoject(par, result, NameClass, "CTPSelectedRegions", ho_CTPSelectedRegions); RecordHoject(par, result, NameClass, "RectangleZPSearch", ho_RectangleZPSearch); RecordHoject(par, result, NameClass, "RectangleZLSearch", ho_RectangleZLSearch); if (ho_DestRegions != null) { ho_DestRegions.Dispose(); } if (ho_CTLObjectSelected != null) { ho_CTLObjectSelected.Dispose(); } if (ho_CTPObjectSelected != null) { ho_CTPObjectSelected.Dispose(); } #endregion 记录 } }