PaddleOCRHelper.cs 3.6 KB
using Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLL
{
    public class PaddleOCRHelper
    {
        private static Process progressTest;
        static DateTime startTime;
        /// <summary>
        /// 开始检测
        /// </summary>
        /// <param name="pythonExePath">python解释器路径</param>
        /// <param name="pythonFile">python文件</param>
        /// <param name="imgPath">图像文件路径</param>
        /// <returns></returns>
        public static string StartTest(string pythonExePath, string pythonFile, string imgPath)
        {
            string state = "";
            try
            {
                string sArguments = pythonFile + " " + imgPath;
                ProcessStartInfo start = new ProcessStartInfo();
                start.FileName = pythonExePath + " ";//环境路径需要配置好
                start.Arguments = sArguments;
                start.UseShellExecute = false;
                start.RedirectStandardOutput = true;
                start.RedirectStandardInput = true;
                start.RedirectStandardError = true;
                start.CreateNoWindow = true;
                startTime = DateTime.Now;
                using (progressTest = Process.Start(start))
                {
                    state = progressTest.StandardOutput.ReadToEnd();
                    progressTest.WaitForExit(30000);
                    //// 异步获取命令行内容
                    //progressTest.BeginOutputReadLine();
                    //// 为异步获取订阅事件
                    //progressTest.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);
                }
                string[] result = state.Split(new string[] { "\r\n" }, StringSplitOptions.None);
                if (result != null && result.Length > 1)
                {
                    foreach (var item in result.Reverse())
                    {
                        if (item.Contains("OCR-Result:"))
                        {
                            var ocrR = item.Substring(12);
                            if (!string.IsNullOrEmpty(ocrR))
                            {
                                var lst = DeserializeJsonToList<string>(ocrR);
                                if (lst != null && lst.Count > 0)
                                {
                                    state = string.Join(" ", lst);
                                    LogNet.log.Info($"Paddle OCR匹配["+ $"{(DateTime.Now - startTime).TotalSeconds.ToString("f2")}s" + "]:"+ state);
                                }
                                else
                                {
                                    state = "";
                                }
                            }

                            break;
                        }
                    }
                    return state;
                }
                else
                    return "";
            }catch(Exception ex)
            {
                LogNet.log.Error("Paddle OCR匹配异常",ex);
            }
            return "";
        }
        static List<T> DeserializeJsonToList<T>(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
            List<T> list = o as List<T>;
            return list;
        }
    }
}