Как определить угол изображения, содержащего текст для OCR в emgucv csharp
У меня есть govt pan card, и я хочу обработать ее, чтобы получить текстовые данные с помощью tesseract и emgucv. Моя проблема заключается в том, как я буду определять угол наклона текста, чтобы исправить его и перейти к распознаванию текста.
Пожалуйста, найдите код ниже, однако он менее точен.
Не могли бы вы проверить и предложить, что я должен сделать, чтобы улучшить его? любая помощь будет высоко оценена?
Что я уже пробовал:
imgInput = new Image<Bgr, byte>(impath); Image<Gray, Byte> img2 = imgInput.Convert<Gray, Byte>(); Bitmap imgs; Image<Gray, byte> imgout = imgInput.Convert<Gray, byte>().Not().ThresholdBinary(new Gray(50), new Gray(125)); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Emgu.CV.Mat hier = new Emgu.CV.Mat(); var blurredImage = imgInput.SmoothGaussian(5, 5, 0 , 0); CvInvoke.AdaptiveThreshold(imgout, imgout, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 5, 45); CvInvoke.FindContours(imgout, contours, hier, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); if (contours.Size >= 1) { for (int i = 0; i <= contours.Size; i++) { Rectangle rect = CvInvoke.BoundingRectangle(contours[i]); RotatedRect box = CvInvoke.MinAreaRect(contours[i]); PointF[] Vertices = box.GetVertices(); PointF point = box.Center; PointF edge1 = new PointF(Vertices[1].X - Vertices[0].X, Vertices[1].Y - Vertices[0].Y); PointF edge2 = new PointF(Vertices[2].X - Vertices[1].X, Vertices[2].Y - Vertices[1].Y); double r = edge1.X + edge1.Y; double edge1Magnitude = Math.Sqrt(Math.Pow(edge1.X, 2) + Math.Pow(edge1.Y, 2)); double edge2Magnitude = Math.Sqrt(Math.Pow(edge2.X, 2) + Math.Pow(edge2.Y, 2)); PointF primaryEdge = edge1Magnitude > edge2Magnitude ? edge1 : edge2; double primaryMagnitude = edge1Magnitude > edge2Magnitude ? edge1Magnitude : edge2Magnitude; PointF reference = new PointF(1, 0); double refMagnitude = 1; double thetaRads = Math.Acos(((primaryEdge.X * reference.X) + (primaryEdge.Y * reference.Y)) / (primaryMagnitude * refMagnitude)); double thetaDeg = thetaRads * 180 / Math.PI; imgInput = imgInput.Rotate(thetaDeg, new Bgr()); imgInput.Save(@"D:\workspace\EgmuCV\pan\image.jpg"); imgout = imgout.Rotate(box.Angle, new Gray()); imgout.Save(@"D:\workspace\EgmuCV\pan\image2.jpg"); Bitmap bmp = imgout.Bitmap; break; } }