public CharInfo(PlateChar plateChar, Mat originalMat, Rect originalRect, PlateLocateMethod plateLocateMethod, CharSplitMethod charSplitMethod) { this.PlateChar = plateChar; this.OriginalMat = originalMat; this.OriginalRect = originalRect; this.PlateLocateMethod = plateLocateMethod; this.CharSplitMethod = charSplitMethod; }
//原始分割 public static List <CharInfo> SplitePlateByOriginal(Mat originalMat, Mat plateMat, PlateColor plateColor, CharSplitMethod charSplitMethod = CharSplitMethod.原图, int leftLimit = 0, int rightLimit = 0, int topLimit = 0, int bottomLimit = 0, int minWidth = 2, int maxWidth = 30, int minHeight = 10, int maxHeight = 80, float minRatio = 0.08f, float maxRatio = 2f) { List <CharInfo> result = new List <CharInfo>(); Mat gray = plateMat.CvtColor(ColorConversionCodes.BGR2GRAY); Mat matOfClearMaodingAndBorder = ClearMaodingAndBorder(gray, plateColor); OpenCvSharp.Point[][] contours = null; HierarchyIndex[] hierarchyIndices = null; matOfClearMaodingAndBorder.FindContours(out contours, out hierarchyIndices, RetrievalModes.External, ContourApproximationModes.ApproxNone); List <Rect> rects = new List <Rect>(); //将轮廓使用RECT矩形框选出来 for (int index = 0; index < contours.Length; index++) { Rect rect = Cv2.BoundingRect(contours[index]); if (NotOnBorder(rect, plateMat.Size(), leftLimit, rightLimit, topLimit, bottomLimit) && VerifyRect(rect, minWidth, maxWidth, minHeight, maxHeight, minRatio, maxRatio)) { rects.Add(rect); } } rects = RejectInnerRectFromRects(rects); //rects = RejectOutFromRects(rects); rects = AdjustRects(rects); if (rects.Count == 0) { return(result); } for (int index = 0; index < rects.Count; index++) { CharInfo plateCharInfo = new CharInfo(); rects[index] = Utilities.GetSafeRect(rects[index], originalMat); Rect rectROI = rects[index]; if (rectROI.Width == 0 && rectROI.Height == 0) { continue; } Mat matROI = originalMat.SubMat(rectROI); plateCharInfo.OriginalMat = matROI; plateCharInfo.OriginalRect = rectROI; plateCharInfo.CharSplitMethod = charSplitMethod; result.Add(plateCharInfo); } result.Sort(new CharInfoLeftComparer()); return(result); }
// public static PlateInfo GetPlateInfo(PlateInfo plateInfo, PlateColor plateColor, CharSplitMethod splitMethod) { PlateInfo result = new PlateInfo(); result.PlateCategory = plateInfo.PlateCategory; result.OriginalMat = plateInfo.OriginalMat; result.OriginalRect = plateInfo.OriginalRect; result.PlateLocateMethod = plateInfo.PlateLocateMethod; result.PlateColor = plateColor; List <CharInfo> charInfos = new List <CharInfo>(); switch (splitMethod) { case CharSplitMethod.伽马: charInfos = CharSegment_V3.SplitePlateByGammaTransform(plateInfo.OriginalMat, plateColor); break; case CharSplitMethod.指数: charInfos = CharSegment_V3.SplitePlateByIndexTransform(plateInfo.OriginalMat, plateColor); break; case CharSplitMethod.对数: charInfos = CharSegment_V3.SplitePlateByLogTransform(plateInfo.OriginalMat, plateColor); break; case CharSplitMethod.原图: default: charInfos = CharSegment_V3.SplitePlateByOriginal(plateInfo.OriginalMat, plateInfo.OriginalMat, plateColor); break; } //启动SVM识别字符并将其中的非字符去除 for (int index = charInfos.Count - 1; index >= 0; index--) { CharInfo charInfo = charInfos[index]; PlateChar plateChar = PlateChar_SVM.Test(charInfo.OriginalMat); if (plateChar == PlateChar.非字符) { charInfos.RemoveAt(index); } charInfo.PlateChar = plateChar; } result.CharInfos = charInfos; //检测 CheckLeftAndRightToRemove(result); CheckPlateColor(result); return(result); }