private TextLine GetTextLine(Mat src) { TextLine textLine = new TextLine(); float scale = (float)crnnDstHeight / (float)src.Rows; int dstWidth = (int)((float)src.Cols * scale); Mat srcResize = new Mat(); CvInvoke.Resize(src, srcResize, new Size(dstWidth, crnnDstHeight)); Tensor <float> inputTensors = OcrUtils.SubstractMeanNormalize(srcResize, MeanValues, NormValues); var inputs = new List <NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(inputNames[0], inputTensors) }; try { using (IDisposableReadOnlyCollection <DisposableNamedOnnxValue> results = crnnNet.Run(inputs)) { var resultsArray = results.ToArray(); var dimensions = resultsArray[0].AsTensor <float>().Dimensions; float[] outputData = resultsArray[0].AsEnumerable <float>().ToArray(); return(ScoreToTextLine(outputData, dimensions[1], dimensions[2])); } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); //throw ex; } return(textLine); }
private Angle GetAngle(Mat src) { Angle angle = new Angle(); Mat angleImg = new Mat(); CvInvoke.Resize(src, angleImg, new Size(angleDstWidth, angleDstHeight)); Tensor <float> inputTensors = OcrUtils.SubstractMeanNormalize(angleImg, MeanValues, NormValues); var inputs = new List <NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(inputNames[0], inputTensors) }; try { using (IDisposableReadOnlyCollection <DisposableNamedOnnxValue> results = angleNet.Run(inputs)) { var resultsArray = results.ToArray(); Console.WriteLine(resultsArray); float[] outputData = resultsArray[0].AsEnumerable <float>().ToArray(); return(ScoreToAngle(outputData, angleCols)); } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); //throw ex; } return(angle); }
public List <TextBox> GetTextBoxes(Mat src, ScaleParam scale, float boxScoreThresh, float boxThresh, float unClipRatio) { Mat srcResize = new Mat(); CvInvoke.Resize(src, srcResize, new Size(scale.DstWidth, scale.DstHeight)); Tensor <float> inputTensors = OcrUtils.SubstractMeanNormalize(srcResize, MeanValues, NormValues); var inputs = new List <NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(inputNames[0], inputTensors) }; try { using (IDisposableReadOnlyCollection <DisposableNamedOnnxValue> results = dbNet.Run(inputs)) { var resultsArray = results.ToArray(); Console.WriteLine(resultsArray); var textBoxes = GetTextBoxes(resultsArray, srcResize.Rows, srcResize.Cols, scale, boxScoreThresh, boxThresh, unClipRatio); return(textBoxes); } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); } return(null); }
public OcrResult Detect(string img, int padding, int maxSideLen, float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle) { Mat originSrc = CvInvoke.Imread(img, ImreadModes.Color);//default : BGR int originMaxSide = Math.Max(originSrc.Cols, originSrc.Rows); int resize; if (maxSideLen <= 0 || maxSideLen > originMaxSide) { resize = originMaxSide; } else { resize = maxSideLen; } resize += 2 * padding; Rectangle paddingRect = new Rectangle(padding, padding, originSrc.Cols, originSrc.Rows); Mat paddingSrc = OcrUtils.MakePadding(originSrc, padding); ScaleParam scale = ScaleParam.GetScaleParam(paddingSrc, resize); return(DetectOnce(paddingSrc, paddingRect, scale, boxScoreThresh, boxThresh, unClipRatio, doAngle, mostAngle)); }
public OcrResult Detect(string img, int padding, int imgResize, float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle) { Mat brgSrc = CvInvoke.Imread(img, ImreadModes.Color);//default : BGR Mat originSrc = new Mat(); CvInvoke.CvtColor(brgSrc, originSrc, ColorConversion.Bgr2Rgb);// convert to RGB Rectangle originRect = new Rectangle(padding, padding, originSrc.Cols, originSrc.Rows); Mat paddingSrc = OcrUtils.MakePadding(originSrc, padding); int resize; if (imgResize <= 0) { resize = Math.Max(paddingSrc.Cols, paddingSrc.Rows); } else { resize = imgResize; } ScaleParam scale = ScaleParam.GetScaleParam(paddingSrc, resize); return(DetectOnce(paddingSrc, originRect, scale, boxScoreThresh, boxThresh, unClipRatio, doAngle, mostAngle)); }
private OcrResult DetectOnce(Mat src, Rectangle originRect, ScaleParam scale, float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle) { Mat textBoxPaddingImg = src.Clone(); int thickness = OcrUtils.GetThickness(src); Console.WriteLine("=====Start detect====="); var startTicks = DateTime.Now.Ticks; Console.WriteLine("---------- step: dbNet getTextBoxes ----------"); var textBoxes = dbNet.GetTextBoxes(src, scale, boxScoreThresh, boxThresh, unClipRatio); var dbNetTime = (DateTime.Now.Ticks - startTicks) / 10000F; Console.WriteLine($"TextBoxesSize({textBoxes.Count})"); textBoxes.ForEach(x => Console.WriteLine(x)); //Console.WriteLine($"dbNetTime({dbNetTime}ms)"); Console.WriteLine("---------- step: drawTextBoxes ----------"); OcrUtils.DrawTextBoxes(textBoxPaddingImg, textBoxes, thickness); //CvInvoke.Imshow("ResultPadding", textBoxPaddingImg); //---------- getPartImages ---------- List <Mat> partImages = OcrUtils.GetPartImages(src, textBoxes); if (isPartImg) { for (int i = 0; i < partImages.Count; i++) { CvInvoke.Imshow($"PartImg({i})", partImages[i]); } } Console.WriteLine("---------- step: angleNet getAngles ----------"); List <Angle> angles = angleNet.GetAngles(partImages, doAngle, mostAngle); //angles.ForEach(x => Console.WriteLine(x)); //Rotate partImgs for (int i = 0; i < partImages.Count; ++i) { if (angles[i].Index == 1) { partImages[i] = OcrUtils.MatRotateClockWise180(partImages[i]); } if (isDebugImg) { CvInvoke.Imshow($"DebugImg({i})", partImages[i]); } } Console.WriteLine("---------- step: crnnNet getTextLines ----------"); List <TextLine> textLines = crnnNet.GetTextLines(partImages); //textLines.ForEach(x => Console.WriteLine(x)); List <TextBlock> textBlocks = new List <TextBlock>(); for (int i = 0; i < textLines.Count; ++i) { TextBlock textBlock = new TextBlock(); textBlock.BoxPoints = textBoxes[i].Points; textBlock.BoxScore = textBoxes[i].Score; textBlock.AngleIndex = angles[i].Index; textBlock.AngleScore = angles[i].Score; textBlock.AngleTime = angles[i].Time; textBlock.Text = textLines[i].Text; textBlock.CharScores = textLines[i].CharScores; textBlock.CrnnTime = textLines[i].Time; textBlock.BlockTime = angles[i].Time + textLines[i].Time; textBlocks.Add(textBlock); } //textBlocks.ForEach(x => Console.WriteLine(x)); var endTicks = DateTime.Now.Ticks; var fullDetectTime = (endTicks - startTicks) / 10000F; //Console.WriteLine($"fullDetectTime({fullDetectTime}ms)"); //cropped to original size Mat boxImg = new Mat(textBoxPaddingImg, originRect); StringBuilder strRes = new StringBuilder(); textBlocks.ForEach(x => strRes.AppendLine(x.Text)); OcrResult ocrResult = new OcrResult(); ocrResult.TextBlocks = textBlocks; ocrResult.DbNetTime = dbNetTime; ocrResult.BoxImg = boxImg; ocrResult.DetectTime = fullDetectTime; ocrResult.StrRes = strRes.ToString(); return(ocrResult); }