public bool SetByDefectCell(DefectCell defectCell, int regionIndex, EMarkDataType markType) { if (defectCell == null || defectCell.DefectRegions == null || regionIndex < 0 || regionIndex >= defectCell.DefectRegions.Count || defectCell.DefectRegions[regionIndex] == null || defectCell.DefectRegions[regionIndex].DefectInfoIndexList == null || defectCell.DefectRegions[regionIndex].DefectInfoIndexList.Count <= 0 || defectCell.DefectInfos == null || defectCell.DefectInfos.Count <= 0) { return(false); } SingleDefectRegion defectRegion = defectCell.DefectRegions[regionIndex]; MarkRegionType = markType; SmallestRect = new Rectangle(defectRegion.SmallestRect.X, defectRegion.SmallestRect.Y, defectRegion.SmallestRect.Width, defectRegion.SmallestRect.Height); DefectInfos = new Dictionary <int, DefectInfo>(); foreach (var index in defectRegion.DefectInfoIndexList) { if (index < 0 || index >= defectCell.DefectInfos.Count) { return(false); } DefectInfo defectInfo = new DefectInfo(); defectInfo.CodeNum = defectCell.DefectInfos[index].CodeNum; Rectangle rect = defectCell.DefectInfos[index].DefectRect; defectInfo.DefectRect = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height); if (DefectInfos.ContainsKey(index)) { return(false); } else { DefectInfos.Add(index, defectInfo); } } return(true); }
public static void GenDefectRegions(Bitmap bitmap, List <Rectangle> rectangles, double radiusOfDilation, out List <SingleDefectRegion> defectRegions) { defectRegions = new List <SingleDefectRegion>(); HObject ho_image; HObject ho_ConnectedDilations; HTuple hv_Row1OfRectangles = new HTuple(); HTuple hv_Row2OfRectangles = new HTuple(); HTuple hv_Column1OfRectangles = new HTuple(); HTuple hv_Column2OfRectangles = new HTuple(); HTuple hv_RadiusOfDilation = new HTuple(); HTuple hv_IndexOfRectangles = new HTuple(); HTuple hv_NumberListOfRectangles = new HTuple(); // initialation HOperatorSet.GenEmptyObj(out ho_image); ho_image.Dispose(); ImageOperateTools.Bitmap8HObjectBpp8(bitmap, out ho_image); for (int i = 0; i < rectangles.Count; i++) { var rectangle = rectangles[i]; hv_Row1OfRectangles.Append(new HTuple(rectangle.Top)); hv_Row2OfRectangles.Append(new HTuple(rectangle.Bottom)); hv_Column1OfRectangles.Append(new HTuple(rectangle.Left)); hv_Column2OfRectangles.Append(new HTuple(rectangle.Right)); } hv_RadiusOfDilation = radiusOfDilation; dilate_regions_pro(ho_image, out ho_ConnectedDilations, hv_Row1OfRectangles, hv_Row2OfRectangles, hv_Column1OfRectangles, hv_Column2OfRectangles, hv_RadiusOfDilation, out hv_IndexOfRectangles, out hv_NumberListOfRectangles); List <int> defectInfoIndexList = new List <int>(); List <int> defectInfoNumberList = new List <int>(); if (hv_IndexOfRectangles.TupleLength() > 0 && hv_NumberListOfRectangles.TupleLength() > 0) { defectInfoIndexList.AddRange(hv_IndexOfRectangles.ToIArr()); defectInfoNumberList.AddRange(hv_NumberListOfRectangles.ToIArr()); } else { return; } HOperatorSet.CountObj(ho_ConnectedDilations, out var hv_NumberOfDilations); for (var index = 1; index <= hv_NumberOfDilations; ++index) { SingleDefectRegion defectRegion = new SingleDefectRegion(); HOperatorSet.SelectObj(ho_ConnectedDilations, out var ho_Dilation, index); // DefectRegion.DefectInfoIndexList for (var cnt = 0; cnt < defectInfoNumberList[index - 1]; ++cnt) { defectRegion.DefectInfoIndexList.Add(defectInfoIndexList[0]); defectInfoIndexList.RemoveAt(0); } // DefectRegion.Xldxxx convert_single_region_to_points(ho_Dilation, out var hv_posYs, out var hv_posXs, out var hv_pointsNum); if (hv_posYs.TupleLength() > 0) { defectRegion.XldYs.AddRange(hv_posYs.ToDArr()); } if (hv_posXs.TupleLength() > 0) { defectRegion.XldXs.AddRange(hv_posXs.ToDArr()); } if (hv_pointsNum.TupleLength() > 0) { defectRegion.XldPointCount.AddRange(hv_pointsNum.ToIArr()); } // DefectRegion.SmallestRect HOperatorSet.SmallestRectangle1(ho_Dilation, out var hv_Row1, out var hv_Column1, out var hv_Row2, out var hv_Column2); defectRegion.SmallestRect = Rectangle.FromLTRB(hv_Column1.I, hv_Row1.I, hv_Column2.I, hv_Row2.I); defectRegions.Add(defectRegion); } return; }