diff --git a/LibCamera/IImageCollector.cs b/LibCamera/IImageCollector.cs deleted file mode 100644 index 7107e64..0000000 --- a/LibCamera/IImageCollector.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Drawing; - -namespace LibCamera -{ - public delegate void OnImageCollectorMessage(string msg); - public delegate void OnImageCollectorInfo(string info); - public delegate void OnImageCollectorConnected(string serial); - public delegate void OnImageCollectorDisConnected(string serial); - public delegate void OnImageCollectorData(byte[] imageData); - public interface IImageCollector - { - event OnImageCollectorMessage OnImageCollectorMessage; - event OnImageCollectorInfo OnImageCollectorInfo; - event OnImageCollectorConnected OnImageCollectorConnected; - event OnImageCollectorDisConnected OnImageCollectorDisConnected; - event OnImageCollectorData OnImageCollectorData; - void Start(); - void Stop(); - void SetPixelFormat(string pixelFormat); - void SetExposureTime(double exposureTime); - void SetGainRawGain(double gain); - void SetAcquisitionMode(string acquisitionMode); - void SetTriggerMode(string triggerMode); - void StartSoftwareGrabbing(); - } -} diff --git a/LibCamera/ImageCollector.cs b/LibCamera/ImageCollector.cs deleted file mode 100644 index f14a622..0000000 --- a/LibCamera/ImageCollector.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using ThridLibray; - -namespace LibCamera -{ - public class ImageCollector : IImageCollector - { - public event OnImageCollectorMessage OnImageCollectorMessage; - public event OnImageCollectorInfo OnImageCollectorInfo; - public event OnImageCollectorConnected OnImageCollectorConnected; - public event OnImageCollectorDisConnected OnImageCollectorDisConnected; - public event OnImageCollectorData OnImageCollectorData; - private IDevice m_dev_cam; - private bool m_abort = false; - private DateTime m_start = DateTime.Now; - private string m_serial; - public ImageCollector(string serial) - { - m_serial = serial; - } - public void Start() - { - m_abort = false; - Task.Run(() => { ConnectDevice(); }); - } - private void ConnectDevice() - { - m_start = DateTime.Now.AddSeconds(-6); - while (true) - { - if (m_abort) - return; - Thread.Sleep(100); - try - { - if (m_dev_cam == null || (m_dev_cam.IsOpen == false && ((DateTime.Now - m_start).TotalSeconds >= 5))) - { - OnImageCollectorDisConnected?.Invoke(m_serial); - if (m_dev_cam != null && !m_dev_cam.IsOpen) - m_dev_cam.StreamGrabber.ImageGrabbed -= StreamGrabber_ImageGrabbed; - m_dev_cam = null; - Enumerator.EnumerateDevices(); - m_dev_cam = Enumerator.GetDeviceByKey(m_serial); - if (m_dev_cam == null) - continue; - m_dev_cam.Open(); - if (m_dev_cam.IsOpen) - { - m_dev_cam.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed; - OnImageCollectorInfo?.Invoke($"Device {m_serial} connected."); - OnImageCollectorConnected?.Invoke(m_serial); - } - } - } - catch (Exception ex) - { - m_dev_cam = null; - OnImageCollectorMessage?.Invoke($"ConnectDevice {m_serial} Exception: {ex.Message}"); - } - } - } - - private void StreamGrabber_ImageGrabbed(object sender, GrabbedEventArgs e) - { - OnImageCollectorData?.Invoke(e.GrabResult.Image); - } - public void Stop() - { - try - { - m_abort = true; - if (m_dev_cam != null) - { - m_dev_cam.StreamGrabber.ImageGrabbed -= StreamGrabber_ImageGrabbed; - if (m_dev_cam.IsOpen) - { - m_dev_cam.Close(); - } - m_dev_cam = null; - } - } - catch (Exception ex) - { - OnImageCollectorMessage?.Invoke($"Stop {m_serial} Exception: {ex.Message}"); - } - } - private bool IsDeviceConnected() - { - return m_dev_cam != null && m_dev_cam.IsOpen; - } - public void SetPixelFormat(string pixelFormat) - { - if (!IsDeviceConnected()) - return; - using (IEnumParameter p = m_dev_cam.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) - { - p.SetValue(pixelFormat); - } - } - public void SetExposureTime(double exposureTime) - { - if (!IsDeviceConnected()) - return; - using (IFloatParameter p = m_dev_cam.ParameterCollection[ParametrizeNameSet.ExposureTime]) - { - p.SetValue(exposureTime); - } - } - public void SetGainRawGain(double gain) - { - if (!IsDeviceConnected()) - return; - using (IFloatParameter p = m_dev_cam.ParameterCollection[ParametrizeNameSet.GainRaw]) - { - p.SetValue(gain); - } - } - public void SetAcquisitionMode(string acquisitionMode) - { - if (!IsDeviceConnected()) - return; - using (IEnumParameter p = m_dev_cam.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) - { - p.SetValue(acquisitionMode); - } - } - public void SetTriggerMode(string triggerMode) - { - if (!IsDeviceConnected()) - return; - using (IEnumParameter p = m_dev_cam.ParameterCollection[ParametrizeNameSet.TriggerMode]) - { - p.SetValue(triggerMode); - } - } - public void StartSoftwareGrabbing() - { - if (!IsDeviceConnected()) - return; - m_dev_cam.TriggerSet.Open(TriggerSourceEnum.Software); - if (!m_dev_cam.GrabUsingGrabLoopThread()) - OnImageCollectorMessage("开启采集失败"); - else - OnImageCollectorInfo($"相机{m_serial}加载完毕"); - } - } -} diff --git a/LibCamera/LibCamera.csproj b/LibCamera/LibCamera.csproj deleted file mode 100644 index b58fd53..0000000 --- a/LibCamera/LibCamera.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Debug - AnyCPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64} - Library - Properties - LibCamera - LibCamera - v4.7.2 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - 7.3 - prompt - - - - ..\dll\CLIDelegate.dll - - - - - - - - - - - ..\dll\ThridLibray.dll - - - - - - - - - \ No newline at end of file diff --git a/LibCamera/Properties/AssemblyInfo.cs b/LibCamera/Properties/AssemblyInfo.cs deleted file mode 100644 index 2e8e1ab..0000000 --- a/LibCamera/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("LibCamera")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("HP")] -[assembly: AssemblyProduct("LibCamera")] -[assembly: AssemblyCopyright("Copyright © HP 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("884c8bb2-78d9-4eed-a2fa-492f075e1f64")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LibImageService/ImageService.cs b/LibImageService/ImageService.cs deleted file mode 100644 index d2c6d97..0000000 --- a/LibImageService/ImageService.cs +++ /dev/null @@ -1,46 +0,0 @@ -using LibCamera; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace LibImageService -{ - public class ImageService - { - IImageCollector m_imageCollectorOCR; - IImageCollector m_imageCollectorLocation; - //private Dictionary - public ImageService(string serialLocation, string serialOCR) - { - m_imageCollectorLocation = new ImageCollector(serialLocation); - m_imageCollectorOCR = new ImageCollector(serialOCR); - m_imageCollectorLocation.OnImageCollectorData += M_imageCollectorLocation_OnImageCollectorData; - m_imageCollectorLocation.OnImageCollectorMessage += M_imageCollectorLocation_OnImageCollectorMessage; - m_imageCollectorLocation.OnImageCollectorInfo += M_imageCollectorLocation_OnImageCollectorInfo; - - } - - private void M_imageCollectorLocation_OnImageCollectorInfo(string info) - { - throw new NotImplementedException(); - } - - private void M_imageCollectorLocation_OnImageCollectorMessage(string msg) - { - throw new NotImplementedException(); - } - - private void M_imageCollectorLocation_OnImageCollectorData(byte[] imageData) - { - throw new NotImplementedException(); - } - - public void Start() - { - m_imageCollectorLocation.Start(); - m_imageCollectorOCR.Start(); - } - } -} diff --git a/LibImageService/LibImageService.csproj b/LibImageService/LibImageService.csproj deleted file mode 100644 index 014c6e3..0000000 --- a/LibImageService/LibImageService.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Debug - AnyCPU - {BC738E23-1B32-497B-A654-569212EF4647} - Library - Properties - LibImageService - LibImageService - v4.7.2 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - 7.3 - prompt - - - - - - - - - - - - - - - - - - - {884c8bb2-78d9-4eed-a2fa-492f075e1f64} - LibCamera - - - - \ No newline at end of file diff --git a/LibImageService/Properties/AssemblyInfo.cs b/LibImageService/Properties/AssemblyInfo.cs deleted file mode 100644 index 65bdb04..0000000 --- a/LibImageService/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("LibImageService")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("HP")] -[assembly: AssemblyProduct("LibImageService")] -[assembly: AssemblyCopyright("Copyright © HP 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("bc738e23-1b32-497b-a654-569212ef4647")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TetraPark.OCR.sln b/TetraPark.OCR.sln index 8432cfa..1ecb037 100644 --- a/TetraPark.OCR.sln +++ b/TetraPark.OCR.sln @@ -1,14 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36518.9 d17.14 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11123.170 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TetraParkOCR", "TetraParkOCR\TetraParkOCR.csproj", "{533800AA-D6A6-4EF7-825F-AA143B1EE901}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibCamera", "LibCamera\LibCamera.csproj", "{884C8BB2-78D9-4EED-A2FA-492F075E1F64}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibImageService", "LibImageService\LibImageService.csproj", "{BC738E23-1B32-497B-A654-569212EF4647}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,30 +27,6 @@ Global {533800AA-D6A6-4EF7-825F-AA143B1EE901}.Release|x64.Build.0 = Release|x64 {533800AA-D6A6-4EF7-825F-AA143B1EE901}.Release|x86.ActiveCfg = Release|x86 {533800AA-D6A6-4EF7-825F-AA143B1EE901}.Release|x86.Build.0 = Release|x86 - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|Any CPU.Build.0 = Debug|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|x64.ActiveCfg = Debug|x64 - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|x64.Build.0 = Debug|x64 - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|x86.ActiveCfg = Debug|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Debug|x86.Build.0 = Debug|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|Any CPU.Build.0 = Release|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|x64.ActiveCfg = Release|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|x64.Build.0 = Release|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|x86.ActiveCfg = Release|Any CPU - {884C8BB2-78D9-4EED-A2FA-492F075E1F64}.Release|x86.Build.0 = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|x64.ActiveCfg = Debug|x64 - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|x64.Build.0 = Debug|x64 - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|x86.ActiveCfg = Debug|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Debug|x86.Build.0 = Debug|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|Any CPU.Build.0 = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|x64.ActiveCfg = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|x64.Build.0 = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|x86.ActiveCfg = Release|Any CPU - {BC738E23-1B32-497B-A654-569212EF4647}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TetraParkOCR/App.config b/TetraParkOCR/App.config index 1e2604c..b82c6d1 100644 --- a/TetraParkOCR/App.config +++ b/TetraParkOCR/App.config @@ -49,6 +49,10 @@ + + + + diff --git a/TetraParkOCR/Form1.cs b/TetraParkOCR/Form1.cs index 67187d8..265d241 100644 --- a/TetraParkOCR/Form1.cs +++ b/TetraParkOCR/Form1.cs @@ -51,7 +51,7 @@ namespace TetraPackOCR #region 字段 委托 - + //创建字段log ILog log = LogManager.GetLogger(typeof(Form1)); /// @@ -93,16 +93,12 @@ namespace TetraPackOCR /// string vppdetFile = AppDomain.CurrentDomain.BaseDirectory + "Data\\VPPFile\\liledet.vpp"; /// - /// OCRVpp文件 - /// - string vppocrFile = AppDomain.CurrentDomain.BaseDirectory + "Data\\VPPFile\\lileOCR.vpp"; - /// /// 存图路径 /// string SaveImageFileOCR = AppDomain.CurrentDomain.BaseDirectory + "SaveImage\\OCR";//ocr存图 string SaveImageFileDET = AppDomain.CurrentDomain.BaseDirectory + "SaveImage\\Det";//ocr存图 - private CogJobManager myJobManager1;//, myJobManager2; - private CogJob myJob1;//, myJob2; + private CogJobManager myJobManager1; + private CogJob myJob1; private string[] verocr = new string[20]; @@ -144,13 +140,22 @@ namespace TetraPackOCR btn_StarDet_manual.Enabled = false; //asf.controllInitializeSize(this); log.Info("软件正在加载..."); + this.Enabled = false; Action action = (() => { - //InitializeCamer1(); - //InitializeCamer2(); + InitializeCamer1(); + InitializeCamer2(); InitializePaddleOCR(); - myJobManager1 = CogSerializer.LoadObjectFromFile(vppdetFile) as CogJobManager; - //myJobManager2 = CogSerializer.LoadObjectFromFile(vppocrFile) as CogJobManager; + + try + { + myJobManager1 = CogSerializer.LoadObjectFromFile(vppdetFile) as CogJobManager; + } + catch (Exception ex) + { + log.Error("定位VPP文件加载失败,请检查文件路径是否正确:" + ex.Message); + myJobManager1 = null; + } InitializeCC24(); @@ -165,6 +170,7 @@ namespace TetraPackOCR this.btn_manualDet.Enabled = true; check_Autorun.Enabled = true; btn_StarDet_manual.Enabled = true; + this.Enabled = true; })); }); @@ -188,29 +194,21 @@ namespace TetraPackOCR TaskFactory tskFactory = new TaskFactory(); tskFactory.ContinueWhenAll(tsk.ToArray(), FlashFormView => { + if (myJobManager1 != null) + { + myJob1 = myJobManager1.Job(0); - - myJob1 = myJobManager1.Job(0); - //myJob2 = myJobManager2.Job(0); - - // 注册结果队列事件 - myJobManager1.UserResultAvailable += new CogJobManager.CogUserResultAvailableEventHandler(DetResult); - // myJobManager2.UserResultAvailable += new CogJobManager.CogUserResultAvailableEventHandler(OCRResult); - + // 注册结果队列事件 + myJobManager1.UserResultAvailable += new CogJobManager.CogUserResultAvailableEventHandler(DetResult); + } }); - - } catch (Exception ex) { log.Error(ex.Message); } - - } - - /// /// 窗体关闭 /// @@ -232,33 +230,19 @@ namespace TetraPackOCR ClossCam(); - // 注销结果队列事件 + //// 注销结果队列事件 myJobManager1.UserResultAvailable -= new CogJobManager.CogUserResultAvailableEventHandler(DetResult); - //myJobManager2.UserResultAvailable -= new CogJobManager.CogUserResultAvailableEventHandler(OCRResult); myJobManager1.Shutdown(); - //myJobManager2.Shutdown(); CloseCC24(); - Application.DoEvents(); - System.Environment.Exit(0); + //Application.DoEvents(); + //System.Environment.Exit(0); } catch { - ClossCam(); - - // 注销结果队列事件 - myJobManager1.UserResultAvailable -= new CogJobManager.CogUserResultAvailableEventHandler(DetResult); - //myJobManager2.UserResultAvailable -= new CogJobManager.CogUserResultAvailableEventHandler(OCRResult); - myJobManager1.Shutdown(); - //myJobManager2.Shutdown(); - - - - CloseCC24(); - Application.DoEvents(); System.Environment.Exit(0); } @@ -276,7 +260,7 @@ namespace TetraPackOCR LogShowLib.LogHelper lib = new LogShowLib.LogHelper(); //为log4net导入配置文件 //若传入目录未找到配置文件,将创建一个LogConfig.xml - + log4net.Config.XmlConfigurator.Configure(lib.GetXMLStream(AppDomain.CurrentDomain.BaseDirectory)); } catch (Exception ex) @@ -294,67 +278,77 @@ namespace TetraPackOCR #region 相机1 定义为OCR相机 private void InitializeCamer1() { - DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机 + try + { + DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机 - // m_dev_cam0 = Enumerator.GetDeviceByIndex(0);//通过索引获取 - m_dev_cam0 = Enumerator.GetDeviceByKey("Machine Vision:CK21686DAK00001");//通过"设备厂商名:设备序列号"获取 - //m_dev_cam0 = Enumerator.GetDeviceByGigeIP("192.168.20.2");//通过IP地址获取 + // m_dev_cam0 = Enumerator.GetDeviceByIndex(0);//通过索引获取 + m_dev_cam0 = Enumerator.GetDeviceByKey("Machine Vision:CK21686DAK00001");//通过"设备厂商名:设备序列号"获取 + if (m_dev_cam0 == null) + { + log.Error("未发现OCR相机,请检查相机连接"); + return; + } + m_dev_cam0.CameraOpened += m_dev0_CameraOpened; + m_dev_cam0.CameraClosed += m_dev0_CameraClosed; + m_dev_cam0.ConnectionLost += m_dev0_ConnectionLost; - m_dev_cam0.CameraOpened += m_dev0_CameraOpened; - m_dev_cam0.CameraClosed += m_dev0_CameraClosed; - m_dev_cam0.ConnectionLost += m_dev0_ConnectionLost; + if (!m_dev_cam0.Open()) + { + MessageBox.Show("OCR相机打开失败"); + } + // 设置图像格式 + // set PixelFormat + using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) + { + ImagePixelFormat = "BayerRG8"; + //ImagePixelFormat = "Mono8"; + p.SetValue(ImagePixelFormat); + } - if(!m_dev_cam0.Open()) - { - MessageBox.Show("OCR相机打开失败"); - } - // 设置图像格式 - // set PixelFormat - using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) - { - ImagePixelFormat = "BayerRG8"; - //ImagePixelFormat = "Mono8"; - p.SetValue(ImagePixelFormat); - } + // 设置曝光 - // 设置曝光 - - using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ExposureTime]) - { - p.SetValue(80000); - } - // 设置增益 - - using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.GainRaw]) - { - p.SetValue(2.5); - } - using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) - { - p.SetValue("Continuous"); - } - using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.TriggerMode]) - { - p.SetValue("On"); - } - - //if (!m_dev_cam0.Open()) - //{ - // MessageBox.Show(@"OCR相机连接失败"); - // return; - //} - m_dev_cam0.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_0; - m_dev_cam0.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_0; - // 打开Software Trigger - // Set Software Trigger - m_dev_cam0.TriggerSet.Open(TriggerSourceEnum.Software); - if (!m_dev_cam0.GrabUsingGrabLoopThread()) - { + using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ExposureTime]) + { + p.SetValue(80000); + } + // 设置增益 - // 开启采集失败 - log.Error("开启采集失败"); + using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.GainRaw]) + { + p.SetValue(2.5); + } + using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) + { + p.SetValue("Continuous"); + } + using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.TriggerMode]) + { + p.SetValue("On"); + } + + //if (!m_dev_cam0.Open()) + //{ + // MessageBox.Show(@"OCR相机连接失败"); + // return; + //} + m_dev_cam0.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_0; + m_dev_cam0.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_0; + // 打开Software Trigger + // Set Software Trigger + m_dev_cam0.TriggerSet.Open(TriggerSourceEnum.Software); + if (!m_dev_cam0.GrabUsingGrabLoopThread()) + { + // 开启采集失败 + log.Error("开启采集失败"); + } + log.Info("OCR相机加载完毕"); + } + catch (Exception ex) + { + log.Error("OCR相机加载失败"); + m_dev_cam0 = null; } - log.Info("OCR相机加载完毕"); } #endregion @@ -394,7 +388,7 @@ namespace TetraPackOCR bmp = e.GrabResult.ToBitmap(true); OCRResult(bmp); - + } catch (Exception ex) { @@ -406,65 +400,79 @@ namespace TetraPackOCR #region 相机2 定义为定位相机 private void InitializeCamer2() { - DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机 - - //m_dev_cam1 = Enumerator.GetDeviceByIndex(1);//通过索引获取 - m_dev_cam1 = Enumerator.GetDeviceByKey("Machine Vision:BK27185BAK00038");//通过"设备厂商名:设备序列号"获取 - //m_dev_cam1 = Enumerator.GetDeviceByGigeIP("192.168.10.1");//通过IP地址获取 - - m_dev_cam1.CameraOpened += m_dev1_CameraOpened; - m_dev_cam1.CameraClosed += m_dev1_CameraClosed; - m_dev_cam1.ConnectionLost += m_dev1_ConnectionLost; - - if (!m_dev_cam1.Open()) + try { - MessageBox.Show("定位相机打开失败"); + DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机 + + //m_dev_cam1 = Enumerator.GetDeviceByIndex(1);//通过索引获取 + m_dev_cam1 = Enumerator.GetDeviceByKey("Machine Vision:BK27185BAK00038");//通过"设备厂商名:设备序列号"获取 + //m_dev_cam1 = Enumerator.GetDeviceByGigeIP("192.168.10.1");//通过IP地址获取 + + if (m_dev_cam1 == null) + { + log.Error("未发现OCR相机,请检查相机连接"); + return; + } + m_dev_cam1.CameraOpened += m_dev1_CameraOpened; + m_dev_cam1.CameraClosed += m_dev1_CameraClosed; + m_dev_cam1.ConnectionLost += m_dev1_ConnectionLost; + + if (!m_dev_cam1.Open()) + { + MessageBox.Show("定位相机打开失败"); + } + // 设置图像格式 + // set PixelFormat + using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) + { + ImagePixelFormat = "Mono"; + p.SetValue(ImagePixelFormat); + } + + // 设置曝光 + + using (IFloatParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.ExposureTime]) + { + p.SetValue(80000); + } + // 设置增益 + + using (IFloatParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.GainRaw]) + { + p.SetValue(1.0); + } + using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) + { + p.SetValue("Continuous"); + } + using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.TriggerMode]) + { + p.SetValue("On"); + } + //if (!m_dev_cam1.Open()) + //{ + // MessageBox.Show(@"定位相机连接失败"); + // return; + //} + m_dev_cam1.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_1; + m_dev_cam1.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_1; + // 打开Software Trigger + // Set Software Trigger + m_dev_cam1.TriggerSet.Open(TriggerSourceEnum.Software); + if (!m_dev_cam1.GrabUsingGrabLoopThread()) + { + + // 开启采集失败 + log.Error("开启采集失败"); + } + log.Info("定位相机加载完毕"); } - // 设置图像格式 - // set PixelFormat - using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) + catch (Exception ex) { - ImagePixelFormat = "Mono"; - p.SetValue(ImagePixelFormat); + log.Error("定位相机加载失败"); + m_dev_cam1 = null; } - // 设置曝光 - - using (IFloatParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.ExposureTime]) - { - p.SetValue(80000); - } - // 设置增益 - - using (IFloatParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.GainRaw]) - { - p.SetValue(1.0); - } - using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) - { - p.SetValue("Continuous"); - } - using (IEnumParameter p = m_dev_cam1.ParameterCollection[ParametrizeNameSet.TriggerMode]) - { - p.SetValue("On"); - } - //if (!m_dev_cam1.Open()) - //{ - // MessageBox.Show(@"定位相机连接失败"); - // return; - //} - m_dev_cam1.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_1; - m_dev_cam1.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_1; - // 打开Software Trigger - // Set Software Trigger - m_dev_cam1.TriggerSet.Open(TriggerSourceEnum.Software); - if (!m_dev_cam1.GrabUsingGrabLoopThread()) - { - - // 开启采集失败 - log.Error("开启采集失败"); - } - log.Info("定位相机加载完毕"); } #endregion @@ -504,7 +512,7 @@ namespace TetraPackOCR bmp = e.GrabResult.ToBitmap(true); - + //Bitmap bmp = new Bitmap(cogimg.ToBitmap()); MemoryStream ms = new MemoryStream(); bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); @@ -549,20 +557,24 @@ namespace TetraPackOCR void ClossCam() { //注销相机事件 - m_dev_cam0.CameraOpened -= m_dev0_CameraOpened; - m_dev_cam0.CameraClosed -= m_dev0_CameraClosed; - m_dev_cam0.ConnectionLost -= m_dev0_ConnectionLost; - - m_dev_cam1.CameraOpened -= m_dev1_CameraOpened; - m_dev_cam1.CameraClosed -= m_dev1_CameraClosed; - m_dev_cam1.ConnectionLost -= m_dev1_ConnectionLost; - - m_dev_cam0.ShutdownGrab(); - m_dev_cam0.Dispose(); - m_dev_cam0 = null; - m_dev_cam1.ShutdownGrab(); - m_dev_cam1.Dispose(); - m_dev_cam1 = null; + if (m_dev_cam0 != null) + { + m_dev_cam0.CameraOpened -= m_dev0_CameraOpened; + m_dev_cam0.CameraClosed -= m_dev0_CameraClosed; + m_dev_cam0.ConnectionLost -= m_dev0_ConnectionLost; + m_dev_cam0.ShutdownGrab(); + m_dev_cam0.Dispose(); + m_dev_cam0 = null; + } + if (m_dev_cam1 != null) + { + m_dev_cam1.CameraOpened -= m_dev1_CameraOpened; + m_dev_cam1.CameraClosed -= m_dev1_CameraClosed; + m_dev_cam1.ConnectionLost -= m_dev1_ConnectionLost; + m_dev_cam1.ShutdownGrab(); + m_dev_cam1.Dispose(); + m_dev_cam1 = null; + } } #endregion #endregion @@ -570,32 +582,38 @@ namespace TetraPackOCR #region OCR模型参数初始化 private void InitializePaddleOCR() { - //模型初始化 - OCRModelConfig config = new OCRModelConfig(); //创建一个模型参数设置对象 - string rootPath = System.IO.Path.GetDirectoryName(typeof(OCRModelConfig).Assembly.Location); //程序的根目录 - config.det_infer = rootPath + @"\Data\OCRModel\det_infer"; //文字检测模型路径 - config.cls_infer = rootPath + @"\Data\OCRModel\cls_infer"; //文本角度模型路径 - config.rec_infer = rootPath + @"\Data\OCRModel\rec_infer"; //文字内容识别模型路径 - //以上三个模型参数的文件路径只需要写到存放的文件夹名称 - //对于字典来说需要写全加上后缀 - config.keys = rootPath + @"\Data\OCRModel\keys\ppocr_keys.txt"; //词典路径 + try + { + //模型初始化 + OCRModelConfig config = new OCRModelConfig(); //创建一个模型参数设置对象 + string rootPath = System.IO.Path.GetDirectoryName(typeof(OCRModelConfig).Assembly.Location); //程序的根目录 + config.det_infer = rootPath + @"\Data\OCRModel\det_infer"; //文字检测模型路径 + config.cls_infer = rootPath + @"\Data\OCRModel\cls_infer"; //文本角度模型路径 + config.rec_infer = rootPath + @"\Data\OCRModel\rec_infer"; //文字内容识别模型路径 + //以上三个模型参数的文件路径只需要写到存放的文件夹名称 + //对于字典来说需要写全加上后缀 + config.keys = rootPath + @"\Data\OCRModel\keys\ppocr_keys.txt"; //词典路径 - //OCR参数设置 - OCRParameter OcrParameter = new OCRParameter(); //创建一个检测参数设置对象 - - OcrParameter.cpu_math_library_num_threads = 8;//预测并发线程数 - OcrParameter.enable_mkldnn = true;//web部署该值建议设置为0,否则出错,内存如果使用很大,建议该值也设置为0. - OcrParameter.cls = true; //是否执行文字方向分类;默认false - OcrParameter.det = true;//是否开启方向检测,用于检测识别180旋转 - OcrParameter.rec = true; - OcrParameter.use_angle_cls = true;//是否开启方向检测,用于检测识别180旋转 - OcrParameter.det_db_score_mode = true;//是否使用多段线,即文字区域是用多段线还是用矩形, - OcrParameter.det_db_unclip_ratio = 1.5f; - OcrParameter.max_side_len = 1280; + //OCR参数设置 + OCRParameter OcrParameter = new OCRParameter(); //创建一个检测参数设置对象 - //初始化OCR - Engine = new PaddleOCREngine(config, OcrParameter); + OcrParameter.cpu_math_library_num_threads = 8;//预测并发线程数 + OcrParameter.enable_mkldnn = true;//web部署该值建议设置为0,否则出错,内存如果使用很大,建议该值也设置为0. + OcrParameter.cls = true; //是否执行文字方向分类;默认false + OcrParameter.det = true;//是否开启方向检测,用于检测识别180旋转 + OcrParameter.rec = true; + OcrParameter.use_angle_cls = true;//是否开启方向检测,用于检测识别180旋转 + OcrParameter.det_db_score_mode = true;//是否使用多段线,即文字区域是用多段线还是用矩形, + OcrParameter.det_db_unclip_ratio = 1.5f; + OcrParameter.max_side_len = 1280; + //初始化OCR + Engine = new PaddleOCREngine(config, OcrParameter); + } + catch (Exception ex) + { + log.Error(ex.Message + ex.StackTrace); + } } #endregion @@ -1114,7 +1132,7 @@ namespace TetraPackOCR { ll[i] = ll[i].Replace(" ", ""); ll[i] = ll[i].Replace("[", ""); ll[i] = ll[i].Replace("]", ""); string[] str = ll[i].Split('-'); - rescult = rescult + dd[1]+ str[1] + str[0]; + rescult = rescult + dd[1] + str[1] + str[0]; } return rescult; } @@ -1292,8 +1310,8 @@ namespace TetraPackOCR /// private int GetXYRonRightDown(CogPMAlignResults Results) { - - int i=0; + + int i = 0; double[] xx = new double[Results.Count], yy = new double[Results.Count], rr = new double[Results.Count]; //第一次循环将所有坐标取出 for (int j = 0; j < Results.Count; j++) @@ -1304,20 +1322,20 @@ namespace TetraPackOCR } if (Results.Count == 1) { - i= 0; + i = 0; } else if (Results.Count == 2) { - double Xdist,Ydist; + double Xdist, Ydist; Xdist = Math.Abs(xx[0] - xx[1]); Ydist = Math.Abs(yy[0] - yy[1]); - if (Xdist>Ydist) + if (Xdist > Ydist) { - i= Array.IndexOf(xx, xx.Min()); + i = Array.IndexOf(xx, xx.Min()); } - else if(Xdist paixu(List points) + List paixu(List points) { int rowDistance = 50; List> rows = new List>(); @@ -1461,20 +1479,20 @@ namespace TetraPackOCR CutPicture(SaveImageFileOCR + '\\' + strtimef + '\\' + strTime + ".bmp", 200, 1400, 5052, 1600); //List temps = new List(); - + GetOCRImage getOCRImage = new GetOCRImage(); GetOCRImage.FileTimeInfo file = getOCRImage.GetLatesFileImageName(SaveImageFileOCR + '\\' + strtimef, ".bmp"); if (file != null) { byte[] ocrimagebyte = File.ReadAllBytes(file.FileName); Bitmap Bmp = new Bitmap(new MemoryStream(ocrimagebyte)); - List lastocr = new List(); + List lastocr = new List(); OCRResult ocrResult = Engine.DetectText(ocrimagebyte); // log.Debug("读取原始数据1:" + ocrResult.JsonText); List pointsList = new List(); - + string[] sd = Design.Split('-'); foreach (var item in ocrResult.TextBlocks) //将检测框绘制在图片上 { @@ -1485,9 +1503,9 @@ namespace TetraPackOCR g.DrawPolygon(new Pen(Brushes.Red, 2), item.BoxPoints.Select(x => new PointF() { X = x.X, Y = x.Y }).ToArray()); } //lastocr.Add(item.Text); - - pointsList.Add(new Point(item.BoxPoints[0].X, item.BoxPoints[0].Y,item.Text)); - + + pointsList.Add(new Point(item.BoxPoints[0].X, item.BoxPoints[0].Y, item.Text)); + } } @@ -1536,18 +1554,18 @@ namespace TetraPackOCR cc24?.NotifyCamInspectionComplete(1, datas); } } - } + } catch (Exception ex) { - log.Error(ex.Message + "未检测到字符"); - if (this.check_Autorun.Checked == false) - { - byte[] datax = DataConverter.FloatToByte(0.0f, true); - cc24?.NotifyCamInspectionComplete(1, datax); - cc24?.NotifyCamAcqComplete(1); + log.Error(ex.Message + "未检测到字符"); + if (this.check_Autorun.Checked == false) + { + byte[] datax = DataConverter.FloatToByte(0.0f, true); + cc24?.NotifyCamInspectionComplete(1, datax); + cc24?.NotifyCamAcqComplete(1); + } + } } - } - } #region 图片裁剪 private void CutPicture(String picPath, int x, int y, int width, int height) @@ -1557,7 +1575,7 @@ namespace TetraPackOCR //新图片路径 String newPath = System.IO.Path.GetExtension(oldPath); //计算新的文件名,在新文件名后加_new - newPath = oldPath.Substring(0, oldPath.Length - newPath.Length) + "_new"+ mMatchingStr + newPath; + newPath = oldPath.Substring(0, oldPath.Length - newPath.Length) + "_new" + mMatchingStr + newPath; //定义截取矩形 System.Drawing.Rectangle cropArea = new System.Drawing.Rectangle(x, y, width, height); //要截取的区域大小 @@ -1593,25 +1611,25 @@ namespace TetraPackOCR /// private string GETOCR(List readOCR, string design) { - string ocrresult=""; + string ocrresult = ""; string[] d = design.Split('-'); - string pattern = @""+d[1]+"[A-Z0-9]{8}"; + string pattern = @"" + d[1] + "[A-Z0-9]{8}"; for (int i = 0; i < readOCR.Count; i++) { - readOCR[i]=readOCR[i].Replace("_", ""); + readOCR[i] = readOCR[i].Replace("_", ""); readOCR[i] = readOCR[i].Replace(" ", ""); } MatchCollection matchResults; - - try + + try { foreach (var item in readOCR) { - matchResults = Regex.Matches(item, pattern); - for (int i = 0; i < matchResults.Count; i++) - { - ocrresult = ocrresult + matchResults[i]; - } + matchResults = Regex.Matches(item, pattern); + for (int i = 0; i < matchResults.Count; i++) + { + ocrresult = ocrresult + matchResults[i]; + } } } catch @@ -1687,7 +1705,7 @@ namespace TetraPackOCR { lbl_L1_verOcrRs.BackColor = Color.Red; } - else if(s>0.9 & s<1) + else if (s > 0.9 & s < 1) { lbl_L1_verOcrRs.BackColor = Color.Lime; s = 1; @@ -1707,7 +1725,7 @@ namespace TetraPackOCR lbl_L2_verOcrRs.BackColor = Color.Lime; s = 1; } - ocrAcc.Add(s); + ocrAcc.Add(s); this.lbl_L2_verOcrRs.Text = s * 100 + "%"; log.Info("字符对比结果:当前第" + mMnum + "道的读取字符与验证字符相似度为" + s * 100 + "%"); break; @@ -1737,7 +1755,7 @@ namespace TetraPackOCR lbl_L4_verOcrRs.BackColor = Color.Lime; s = 1; } - ocrAcc.Add(s); + ocrAcc.Add(s); this.lbl_L4_verOcrRs.Text = s * 100 + "%"; log.Info("字符对比结果:当前第" + mMnum + "道的读取字符与验证字符相似度为" + s * 100 + "%"); break; @@ -1797,7 +1815,7 @@ namespace TetraPackOCR lbl_L8_verOcrRs.BackColor = Color.Lime; s = 1; } - ocrAcc.Add(s); + ocrAcc.Add(s); this.lbl_L8_verOcrRs.Text = s * 100 + "%"; log.Info("字符对比结果:当前第" + mMnum + "道的读取字符与验证字符相似度为" + s * 100 + "%"); break; @@ -1812,7 +1830,7 @@ namespace TetraPackOCR lbl_L9_verOcrRs.BackColor = Color.Lime; s = 1; } - ocrAcc.Add(s); + ocrAcc.Add(s); this.lbl_L9_verOcrRs.Text = s * 100 + "%"; log.Info("字符对比结果:当前第" + mMnum + "道的读取字符与验证字符相似度为" + s * 100 + "%"); break; @@ -1915,19 +1933,19 @@ namespace TetraPackOCR mMatchingStr = Convert.ToInt32(mMatchingStrf); log.Info("PC接收PLC数据:数据内容:" + mMatchingStr); - if (NumberOfLanes+1 == mMatchingStr) + if (NumberOfLanes + 1 == mMatchingStr) { - if(ocrAcc.Min()<0.95) + if (ocrAcc.Min() < 0.95) { - MessageBox.Show("当前检测中出现严重错误请注意!",this.Text, MessageBoxButtons.OK,MessageBoxIcon.Error); + MessageBox.Show("当前检测中出现严重错误请注意!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } - else if(ocrAcc.Min()>0.95 & ocrAcc.Min()<1) + else if (ocrAcc.Min() > 0.95 & ocrAcc.Min() < 1) { MessageBox.Show("当前检测中出现可允许误差请注意!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } ocrAcc.Clear(); } - + } #endregion @@ -2017,11 +2035,11 @@ namespace TetraPackOCR #region 通讯发送坐标 private void sendToPLC(double x, double y, double r) { - + try { string[] col = Colours.Split(','); - + float xx = (float)x; @@ -2129,12 +2147,12 @@ namespace TetraPackOCR break; } - - - + + + float ocrx = 0, ocry = 0; List l = new List(); l.Add((float)NumberOfLanes); @@ -2169,15 +2187,15 @@ namespace TetraPackOCR if (this.check_Autorun.Checked == false) { List d = new List(); - for (int i=0;i + @@ -199,6 +200,9 @@ ..\packages\OpenCvSharp4.4.11.0.20250507\lib\netstandard2.0\OpenCvSharp.dll + + ..\packages\OpenCvSharp4.Extensions.4.11.0.20250507\lib\netstandard2.0\OpenCvSharp.Extensions.dll + ..\packages\PaddleOCRSharp.5.1.0\lib\net47\PaddleOCRSharp.dll @@ -221,6 +225,9 @@ + + ..\packages\System.Drawing.Common.10.0.0-rc.2.25502.107\lib\net462\System.Drawing.Common.dll + ..\packages\System.Formats.Asn1.10.0.0-rc.2.25502.107\lib\net462\System.Formats.Asn1.dll @@ -336,12 +343,6 @@ - - - {bc738e23-1b32-497b-a654-569212ef4647} - LibImageService - - @@ -351,6 +352,7 @@ + diff --git a/TetraParkOCR/packages.config b/TetraParkOCR/packages.config index 246c8fb..3fd4c87 100644 --- a/TetraParkOCR/packages.config +++ b/TetraParkOCR/packages.config @@ -13,6 +13,8 @@ + + @@ -21,6 +23,7 @@ +