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;
 }
示例#2
0
        //原始分割
        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);
        }
示例#3
0
        //
        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);
        }