using OpenCvSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PaddleOCRSharp.Led { public class LedIdentify { public LedIdentify() { oCRParameter.use_gpu = false; oCRParameter.cpu_math_library_num_threads = 10;//预测并发线程数 oCRParameter.enable_mkldnn = true;//web部署该值建议设置为0,否则出错,内存如果使用很大,建议该值也设置为0. oCRParameter.cls = false; //是否执行文字方向分类;默认false oCRParameter.det = false;//是否开启方向检测,用于检测识别180旋转 oCRParameter.use_angle_cls = false;//是否开启方向检测,用于检测识别180旋转 oCRParameter.det_db_score_mode = false;//是否使用多段线,即文字区域是用多段线还是用矩形, string root = System.IO.Path.GetDirectoryName(typeof(LedIdentify).Assembly.Location); string modelPathroot = root + @"\inference"; config.det_infer = modelPathroot + @"\ch_PP-OCRv3_det_infer"; config.cls_infer = modelPathroot + @"\ch_ppocr_mobile_v2.0_cls_infer"; config.rec_infer = modelPathroot + @"\ch_PP-OCRv3_rec_infer"; config.keys = modelPathroot + @"\ppocr_keys.txt"; } public string DetInfer { get => config.det_infer; set => config.det_infer = value; } public string ClsInfer { get => config.cls_infer; set => config.cls_infer = value; } public string RecInfer { get => config.rec_infer; set => config.rec_infer = value; } public string Keys { get => config.keys; set => config.keys = value; } private PaddleOCREngine engine; private OCRModelConfig config = new OCRModelConfig(); private OCRParameter oCRParameter = new OCRParameter(); public bool Cls { get=> oCRParameter.cls; set => oCRParameter.cls = value; } public bool Det { get => oCRParameter.det; set => oCRParameter.det = value; } public bool UseAngleCls { get => oCRParameter.use_angle_cls; set => oCRParameter.use_angle_cls = value; } public bool DetDbScoreMode { get => oCRParameter.det_db_score_mode; set => oCRParameter.det_db_score_mode = value; } public bool UseGpu { get => oCRParameter.use_gpu; set => oCRParameter.use_gpu = true; } public int CpuMathLibraryNumThreads { get => oCRParameter.cpu_math_library_num_threads; set => oCRParameter.cpu_math_library_num_threads = value; } public bool IsInit { get; private set; } = false; public int UserId { get; private set; } = -1; public bool IsLogin { get; private set; } = false; public string IP { get;private set; } public int Port { get; private set; } public string Username { get; private set; } public string Password { get; private set; } public string SerialNumber => System.Text.Encoding.Default.GetString(info.sSerialNumber).Trim('\0'); public byte AlarmInPortNum=> info.byAlarmInPortNum; public byte AlarmOutPortNum=> info.byAlarmOutPortNum; public byte DiskNum=> info.byDiskNum; public byte DVRType=> info.byDVRType; public byte ChanNum=> info.byChanNum; public byte StartChan=> info.byStartChan; public byte AudioChanNum=> info.byAudioChanNum; public byte IPChanNum=> info.byIPChanNum; public byte ZeroChanNum=> info.byZeroChanNum; public byte MainProto=> info.byMainProto; public byte SubProto=> info.bySubProto; public byte Support=> info.bySupport; public byte Support1=> info.bySupport1; public byte Support2=> info.bySupport2; public ushort DevType=> info.wDevType; public byte Support3=> info.bySupport3; public byte MultiStreamProto=> info.byMultiStreamProto; public byte StartDChan=> info.byStartDChan; public byte StartDTalkChan=> info.byStartDTalkChan; public byte HighDChanNum=> info.byHighDChanNum; public byte LanguageType=> info.byLanguageType; public byte Support4=> info.bySupport4; public ushort PicQuality { get => jpg.wPicQuality; set => jpg.wPicQuality = value; } public ushort PicSize { get=> jpg.wPicSize; set => jpg.wPicSize = value; } public bool IsOCRInit { get; private set; } = false; private QuickNV.HikvisionNetSDK.Defines.NET_DVR_JPEGPARA jpg = new QuickNV.HikvisionNetSDK.Defines.NET_DVR_JPEGPARA(); private byte[] jpgdata = new byte[1024 * 1024 * 10]; private QuickNV.HikvisionNetSDK.Defines.NET_DVR_DEVICEINFO_V30 info = new QuickNV.HikvisionNetSDK.Defines.NET_DVR_DEVICEINFO_V30(); public void InitHikvision() { if (IsInit) return; IsInit = QuickNV.HikvisionNetSDK.Methods.NET_DVR_Init(); } public void InitOCR() { if (IsOCRInit) return; engine = new PaddleOCREngine(config, oCRParameter); IsOCRInit = true; } public void Login(string ip="192.168.2.65",int port = 8000,string username="admin",string password="l147258369") { if (IsLogin) return; IP = ip; Port = port; Username = username; Password = password; info = new QuickNV.HikvisionNetSDK.Defines.NET_DVR_DEVICEINFO_V30(); UserId = QuickNV.HikvisionNetSDK.Methods.NET_DVR_Login_V30(IP, Port, Username, Password, ref info); IsLogin = UserId == 0; } public Mat NET_DVR_CaptureJPEGPicture_NEW(int channel=1) { if (!IsLogin) return new Mat(); uint picsize = 0; QuickNV.HikvisionNetSDK.Methods.NET_DVR_CaptureJPEGPicture_NEW(UserId, channel, ref jpg, jpgdata, (uint)jpgdata.Length, ref picsize); if (picsize == 0) return new Mat(); byte[] result = new byte[picsize]; Array.Copy(jpgdata, result, (int)picsize); return Mat.FromImageData(result); } public void Logout() { if (!IsLogin) return; QuickNV.HikvisionNetSDK.Methods.NET_DVR_Logout(UserId); IsLogin = false; } public OCRResult DetectText(byte[] datas) { if (!IsOCRInit || engine == null) return new OCRResult(); return engine.DetectText(datas); } public unsafe byte[] GetColos(Mat mat) { Mat rgb = mat.CvtColor(ColorConversionCodes.BGR2RGB); var result = new Span(rgb.Data.ToPointer(), rgb.Width * rgb.Height * rgb.Channels()).ToArray(); rgb.Dispose(); return result; } public OCRResult DetectText(Mat mat) { if (!IsOCRInit || engine == null) return new OCRResult(); return engine.DetectText(mat.ToBytes()); } public void DisposeOCR() { if (!IsOCRInit) return; engine?.Dispose(); IsOCRInit = false; } public void Cleanup() { if (!IsInit) return; QuickNV.HikvisionNetSDK.Methods.NET_DVR_Cleanup(); IsInit = false; } } }