目录
基于以下开源项目,做了再次封装
https://github.com/sdcb/OpenVINO.NET
自带模型,可离线部署;
技术路线:VS2022+Sdcb.OpenVINO+Sdcb.OpenVINO.PaddleOCR+OpenCvSharp+NLog+Nancy.Hosting.Self

OCRService started successfully
可以使用post方式访问以下接口
http://localhost:8082/ocr/stream //接收文件流,接收参数[file],返回识别信息
http://localhost:8082/ocr/base64 //接收base64字符串,接收参数[base64str],返回识别信息


try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
imgPath = ofd.FileName;
bmp = new Bitmap(imgPath, true);
RotateImage(bmp);
pictureBox1.Image = bmp;
richTextBox1.Clear();
mat = new Mat(ofd.FileName);
lock (Controller.OCRModule._locker)
{
dt1 = DateTime.Now;
ocrResult = Program.paddleOcr.Run(mat);
dt2 = DateTime.Now;
}
ShowOCRResult(ocrResult);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
///
/// 根据图片exif调整方向
///
///
public void RotateImage(Bitmap img)
{
var exif = img.PropertyItems;
byte orien = 0;
var item = exif.Where(m => m.Id == 274).ToArray();
if (item.Length > 0)
orien = item[0].Value[0];
switch (orien)
{
case 2:
img.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
break;
case 3:
img.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
break;
case 4:
img.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
break;
case 5:
img.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case 6:
img.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
break;
case 7:
img.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case 8:
img.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
break;
default:
break;
}
}
///
/// 显示结果
///
private void ShowOCRResult(PaddleOcrResult ocrResult)
{
richTextBox1.Clear();
// Bitmap bmp = new Bitmap();
richTextBox1.AppendText(ocrResult.Text + "\n");
richTextBox1.AppendText("-----------------------------------\n");
richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");
if (IsPixelFormatIndexed(bmp.PixelFormat))
{
bmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);
using (Image img = Image.FromFile(imgPath))
{
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.DrawImage(img, 0, 0);
}
}
}
else
{
using (Graphics g = Graphics.FromImage(bmp))
{
foreach (var item in ocrResult.Regions)
{
g.DrawRectangle(pen, item.Rect.BoundingRect().Left, item.Rect.BoundingRect().Top, item.Rect.BoundingRect().Width, item.Rect.BoundingRect().Height);
}
}
}
pictureBox1.Image = null;
pictureBox1.Image = bmp;
}
与 PaddleInference.OCRService耗时对比



