public WhiteParaList WhiteDotInspect1(string barcode, string modle, HObject ho_Image, double pixel_MM, string ImagePath) { WhiteParaList WhiteParaReturn = new WhiteParaList(); // Stack for temporary objects HObject[] OTemp = new HObject[20]; long SP_O = 0; // Local iconic variables // Initialize local and output iconic variables HObject ho_EmptyRegion, ho_Region, ho_SelectObjregion; HObject ho_RegionFillUp, ho_RegionErosion, ho_RegionDifference; HObject ho_ImageReduced, ho_Region1, ho_ConnectedRegions; HObject ho_SelectedRegions, ho_ImageReduced1, ho_ImageEmphasize; HObject ho_Region2, ho_ConnectedRegions1, ho_SelectedRegions1; HObject ho_RegionDilation = null, ho_Circle = null, ho_ImageResult = null; HObject ho_Domain11, ho_ImageScaled; // Local control variables HTuple hv_Width, hv_Height, hv_Mean, hv_Deviation, hv_RowY = null, hv_ColumnX = null, hv_Area1 = null;; HTuple hv_meanResult, hv_Number, hv_Number1, hv_Number2, hv_NumDot = null; HTuple hv_Row = new HTuple(), hv_Column = new HTuple(), hv_Radius = new HTuple(); HTuple hv_Index = new HTuple(); HTuple hv_AbsoluteHisto, hv_RelativeHisto; HTuple hv_Max, hv_maxGrayValue; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_SelectObjregion); HOperatorSet.GenEmptyObj(out ho_EmptyRegion); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_RegionErosion); HOperatorSet.GenEmptyObj(out ho_RegionDifference); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_ImageReduced1); HOperatorSet.GenEmptyObj(out ho_ImageEmphasize); HOperatorSet.GenEmptyObj(out ho_Region2); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_RegionDilation); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_ImageResult); HOperatorSet.GenEmptyObj(out ho_Domain11); HOperatorSet.GenEmptyObj(out ho_ImageScaled); HTuple hv_radius_MM = null, hv_area_Pixel = null; hv_radius_MM = pixel_MM; hv_area_Pixel = 0.005 / (pixel_MM * pixel_MM); HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); ho_EmptyRegion.Dispose(); HOperatorSet.GenEmptyRegion(out ho_EmptyRegion); ho_Domain11.Dispose(); HOperatorSet.GetDomain(ho_Image, out ho_Domain11); HOperatorSet.GrayHisto(ho_Domain11, ho_Image, out hv_AbsoluteHisto, out hv_RelativeHisto); HOperatorSet.TupleMax(hv_AbsoluteHisto, out hv_Max); hv_maxGrayValue = hv_AbsoluteHisto.TupleFind(hv_Max); ho_ImageScaled.Dispose(); HOperatorSet.ScaleImage(ho_Image, out ho_ImageScaled, 1, 140 - hv_maxGrayValue[0]); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageScaled, out ho_Region, 80, 255); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Region, out ho_RegionFillUp); ho_RegionErosion.Dispose(); HOperatorSet.ErosionCircle(ho_RegionFillUp, out ho_RegionErosion, 30); ho_RegionDifference.Dispose(); HOperatorSet.Difference(ho_RegionFillUp, ho_RegionErosion, out ho_RegionDifference ); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_RegionDifference, out ho_ImageReduced); HOperatorSet.Intensity(ho_RegionDifference, ho_ImageReduced, out hv_Mean, out hv_Deviation); hv_meanResult = hv_Mean * 1.6; if ((int)(new HTuple(hv_meanResult.TupleGreater(240))) != 0) { hv_meanResult = 240; } ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, hv_meanResult, 255); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", hv_area_Pixel, 99999); HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number); if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0) { OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1); SP_O++; ho_EmptyRegion.Dispose(); HOperatorSet.ConcatObj(OTemp[SP_O - 1], ho_SelectedRegions, out ho_EmptyRegion ); OTemp[SP_O - 1].Dispose(); SP_O = 0; } ho_ImageReduced1.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_RegionErosion, out ho_ImageReduced1); ho_ImageEmphasize.Dispose(); HOperatorSet.Emphasize(ho_ImageReduced1, out ho_ImageEmphasize, 11, 11, 1); ho_Region2.Dispose(); HOperatorSet.VarThreshold(ho_ImageEmphasize, out ho_Region2, hv_Width, hv_Height, 0.2, 120, "light"); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_Region2, out ho_ConnectedRegions1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions1, "area", "and", hv_area_Pixel, 99999); HOperatorSet.CountObj(ho_SelectedRegions1, out hv_Number1); if ((int)(new HTuple(hv_Number1.TupleGreater(0))) != 0) { OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1); SP_O++; ho_EmptyRegion.Dispose(); HOperatorSet.ConcatObj(OTemp[SP_O - 1], ho_SelectedRegions1, out ho_EmptyRegion ); OTemp[SP_O - 1].Dispose(); SP_O = 0; } HOperatorSet.CountObj(ho_EmptyRegion, out hv_Number2); hv_NumDot = hv_Number2 - 1; if (hv_NumDot.I > 5) { WhiteParaReturn.whiteCounts = 5; } else { WhiteParaReturn.whiteCounts = hv_NumDot.I; } if ((int)(new HTuple(hv_Number2.TupleGreater(1))) != 0) { ho_RegionDilation.Dispose(); HOperatorSet.DilationCircle(ho_EmptyRegion, out ho_RegionDilation, 5); HOperatorSet.SmallestCircle(ho_RegionDilation, out hv_Row, out hv_Column, out hv_Radius); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_Row, hv_Column, hv_Radius); ho_ImageResult.Dispose(); HOperatorSet.PaintRegion(ho_Circle, ho_Image, out ho_ImageResult, 0, "margin"); string fileName = ImagePath + "\\" + barcode + ".bmp"; HOperatorSet.WriteImage(ho_ImageResult, "bmp", 0, fileName); string fileName1 = ImagePath + "\\" + "Original" + barcode + ".bmp"; HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName1); if (hv_NumDot.I > 5) { for (int j = 0; j < 5; j++) { ho_SelectObjregion.Dispose(); HOperatorSet.SelectObj(ho_EmptyRegion, out ho_SelectObjregion, j + 2); HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1); WhiteParaReturn.whiteX[j] = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3); WhiteParaReturn.whiteY[j] = (float)Math.Round(hv_RowY.D * pixel_MM, 3); WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3); } } else { for (int j = 0; j < hv_NumDot.I; j++) { ho_SelectObjregion.Dispose(); HOperatorSet.SelectObj(ho_EmptyRegion, out ho_SelectObjregion, j + 2); HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1); WhiteParaReturn.whiteX[j] = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3); WhiteParaReturn.whiteY[j] = (float)Math.Round(hv_RowY.D * pixel_MM, 3); WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3); } } } ho_SelectObjregion.Dispose(); ho_EmptyRegion.Dispose(); ho_Region.Dispose(); ho_RegionFillUp.Dispose(); ho_RegionErosion.Dispose(); ho_RegionDifference.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_ImageReduced1.Dispose(); ho_ImageEmphasize.Dispose(); ho_Region2.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_RegionDilation.Dispose(); ho_Circle.Dispose(); ho_ImageResult.Dispose(); ho_Domain11.Dispose(); ho_ImageScaled.Dispose(); return(WhiteParaReturn); }
/// <summary> /// 白点检测20171010 /// </summary> /// <param name="barcode"></param> /// <param name="ho_Image"></param> /// <param name="pixel_MM"></param> /// <returns></returns> public WhiteParaList WhiteDotInspect(string barcode, string modle, HObject ho_Image, double pixel_MM, string ImagePath) { WhiteParaList WhiteParaReturn = new WhiteParaList(); // Local iconic variables HObject ho_Domain, ho_ImageScaled = null, ho_SelectObjregion; HObject ho_ImageInvert, ho_Region2, ho_ConnectedRegions; HObject ho_SelectedRegions, ho_RegionDilation = null, ho_Circle = null; HObject ho_ImageResult = null; // Local control variables HTuple hv_Name = null, hv_Width = null, hv_Height = null, hv_RowY = null, hv_ColumnX = null, hv_Area1 = null; HTuple hv_Index1 = null, hv_Mean1 = new HTuple(), hv_Deviation1 = new HTuple(); HTuple hv_radius_MM = null, hv_radius_Pixel = null, hv_area_Pixel = null; HTuple hv_Number = null, hv_NumDot = null, hv_Row = new HTuple(); HTuple hv_Column = new HTuple(), hv_Radius = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_SelectObjregion); HOperatorSet.GenEmptyObj(out ho_Domain); HOperatorSet.GenEmptyObj(out ho_ImageScaled); HOperatorSet.GenEmptyObj(out ho_ImageInvert); HOperatorSet.GenEmptyObj(out ho_Region2); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionDilation); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_ImageResult); hv_Name = barcode; hv_NumDot = 0; HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); ho_Domain.Dispose(); HOperatorSet.GetDomain(ho_Image, out ho_Domain); for (hv_Index1 = 0; (int)hv_Index1 <= 255; hv_Index1 = (int)hv_Index1 + 1) { ho_ImageScaled.Dispose(); HOperatorSet.ScaleImage(ho_Image, out ho_ImageScaled, 1.6, -hv_Index1); HOperatorSet.Intensity(ho_Domain, ho_ImageScaled, out hv_Mean1, out hv_Deviation1); if ((int)((new HTuple(hv_Mean1.TupleGreater(20))).TupleAnd(new HTuple(hv_Mean1.TupleLess( 30)))) != 0) { break; } } ho_ImageInvert.Dispose(); HOperatorSet.InvertImage(ho_ImageScaled, out ho_ImageInvert); ho_Region2.Dispose(); HOperatorSet.VarThreshold(ho_ImageInvert, out ho_Region2, hv_Width, hv_Height, 2, 100, "dark"); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region2, out ho_ConnectedRegions); hv_radius_MM = pixel_MM * 1000; hv_radius_Pixel = 20 / hv_radius_MM; hv_area_Pixel = (3.14 * hv_radius_Pixel) * hv_radius_Pixel; ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", hv_area_Pixel, 99999); HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number); hv_NumDot = hv_Number.Clone(); if (hv_NumDot.I > 5) { WhiteParaReturn.whiteCounts = 5; } else { WhiteParaReturn.whiteCounts = hv_NumDot.I; } if ((int)(new HTuple(hv_NumDot.TupleGreater(0))) != 0) { ho_RegionDilation.Dispose(); HOperatorSet.DilationCircle(ho_SelectedRegions, out ho_RegionDilation, 5); HOperatorSet.SmallestCircle(ho_RegionDilation, out hv_Row, out hv_Column, out hv_Radius); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_Row, hv_Column, hv_Radius); ho_ImageResult.Dispose(); HOperatorSet.PaintRegion(ho_Circle, ho_Image, out ho_ImageResult, 0, "margin"); string fileName = ImagePath + "\\" + barcode + ".bmp"; HOperatorSet.WriteImage(ho_ImageResult, "bmp", 0, fileName); string fileName1 = ImagePath + "\\" + "Original" + barcode + ".bmp"; HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName1); if (hv_NumDot.I > 5) { for (int j = 0; j < 5; j++) { ho_SelectObjregion.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions, out ho_SelectObjregion, j + 1); HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1); WhiteParaReturn.whiteX[j] = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3); WhiteParaReturn.whiteY[j] = (float)Math.Round(hv_RowY.D * pixel_MM, 3); WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3); } } else { for (int j = 0; j < hv_NumDot.I; j++) { ho_SelectObjregion.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions, out ho_SelectObjregion, j + 1); HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1); WhiteParaReturn.whiteX[j] = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3); WhiteParaReturn.whiteY[j] = (float)Math.Round(hv_RowY.D * pixel_MM, 3); WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3); } } } //else //{ // string path = "G:\\BlackAndWhiteDotImage"; // if (!Directory.Exists(path)) // { // Directory.CreateDirectory(path); // } // string s_FileName = path + "\\" + DateTime.Now.ToString("yyyyMMdd"); // if (!Directory.Exists(s_FileName)) // { // Directory.CreateDirectory(s_FileName); // } // string FileName = s_FileName + "\\" + "WhiteDotImage"; // if (!Directory.Exists(FileName)) // { // Directory.CreateDirectory(FileName); // } // string fileName = FileName + "\\" + barcode + ".bmp"; // HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName); //} ho_SelectObjregion.Dispose(); ho_Domain.Dispose(); ho_ImageScaled.Dispose(); ho_ImageInvert.Dispose(); ho_Region2.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_RegionDilation.Dispose(); ho_Circle.Dispose(); ho_ImageResult.Dispose(); return(WhiteParaReturn); }