using DVPCameraType; using Microsoft.VisualBasic.Logging; using Newtonsoft.Json.Linq; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSharp.Extensions; using OpenCvSharp.XFeatures2D; using System; using System.ComponentModel; using System.Data; using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; using System.Data.SQLite; using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Linq; using System.Net; using System.Numerics; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using XKRS.Device.SimboVision.SimboHelper; using XKRS.UI; using static HisenceYoloDetection.MainForm; using static System.Runtime.InteropServices.JavaScript.JSType; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; namespace HisenceYoloDetection { public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.Load += (s, e) => { // OnDetectionDone -= Defet_OnDetectionDone; //OnDetectionDone += Defet_OnDetectionDone; }; } MGSCameraDriver Cam1 = new MGSCameraDriver(); MGSCameraDriver Cam2 = new MGSCameraDriver(); public static string RootPath = "D:\\Hisence\\SQLImages\\"; // HikCameraDriver Cam1 = new HikCameraDriver(); //HikCameraDriver Cam2 = new HikCameraDriver(); SQLiteHelper sqlhelper = new SQLiteHelper(); TCPClienDriver Scanner = new TCPClienDriver(); MelsecPLCTCPDriver melsecPLCTCPDriver = new MelsecPLCTCPDriver(); SimboObjectDetection simboObjectDetection = new SimboObjectDetection(); SimboObjectDetection simboObjectDetButton = new SimboObjectDetection(); // CheckDiffSciHelper checkDiffSciHelper = new CheckDiffSciHelper(); // ManagerModelHelper managerModelHelper = new ManagerModelHelper(); PaddleOcrModel paddleOcrModel = new PaddleOcrModel(); PaddleOcrModelCountry paddleOcrModelCountry = new PaddleOcrModelCountry(); List xKHisences = new List(); static AutoResetEvent myResetEvent = new AutoResetEvent(false); bool PLC545 = false; bool PLC548 = false; string m_sKEYENCEBar; string IfChangeLanguage = "";//是否换洗衣机的型号 bool bTriger = true;//是否可以触发检测 bool bBarTriger = false;//第一个地址完成后才能触发第二个位置 bool bBar = false;//是否可以反馈条码 bool IfCam1OneTriger = false;//相机1第一次拍照 bool IfCam1TwoTriger = false;//相机1第2次拍照 bool IfCam2Triger = false;//相机2第一次拍照 Mat Cam1ImgOne = new Mat();//实时相机1的照片 Mat Cam1ImgTwo = new Mat();//实时相机1的照片 Mat Cam2ImgShowBar = new Mat();//实时相机2的照片 用来识别条码 XKHisence xKNow;//数据库中的洗衣机数据 XK_HisenceWord xK_HisenceSQLWord = new XK_HisenceWord(); bool bOn = false; //////////////////////////// public static int m_CamCount = 0; public int m_n_dev_count = 0; public static dvpCameraInfo[] m_info = new dvpCameraInfo[16]; bool ifXZeroValue = false; bool ifYZeroValue = false; bool ifZZeroValue = false; bool ifXForward = false; bool ifYForward = false; bool ifZForward = false; bool ifXBackward = false; bool ifYBackward = false; bool ifZBackward = false; string LablePath = ""; //录入数据库 string BarPath = ""; string Cam1OnePath = ""; string Cam1TwoPath = ""; string ModelChangePath = ""; /// /// 查看相机列表 /// public void InitDevList() { dvpStatus status; uint i, n = 0; dvpCameraInfo dev_info = new dvpCameraInfo(); // "n" represents the number of cameras that is enumerated successfully, the drop-down list contains each camera's FriendlyName. DevNameCombo.Items.Clear(); // Get the number of cameras that has been connected to a computer. status = DVPCamera.dvpRefresh(ref n); Debug.Assert(status == dvpStatus.DVP_STATUS_OK); m_n_dev_count = (int)n; if (status == dvpStatus.DVP_STATUS_OK) { m_CamCount = 0; for (i = 0; i < n; i++) { // Acquire each camera's information one by one. status = DVPCamera.dvpEnum(i, ref dev_info); Debug.Assert(status == dvpStatus.DVP_STATUS_OK); if (status == dvpStatus.DVP_STATUS_OK) { m_info[m_CamCount] = dev_info; int item = -1; // add User Define Name item = DevNameCombo.Items.Add(dev_info.UserID); if (item == 0) { DevNameCombo.SelectedIndex = item; } m_CamCount++; if (item == 0) { DevNameCombo.SelectedIndex = item; } } } } } System.Timers.Timer SpeedTimer = new System.Timers.Timer(); System.Timers.Timer PostionTimer = new System.Timers.Timer(); System.Timers.Timer t; public delegate void MyDelegateUI(); //定义委托类型 MyDelegateUI myDelegateUI; //声明委托对象 public delegate void MyPosDelegateUI(); //定义委托类型 MyPosDelegateUI myPosDelegateUI; //声明委托对象 public delegate void MyLogDelegateUI(); //定义委托类型 MyLogDelegateUI myLogDelegateUI; //声明日志委托对象 private void Application_ThreadException(Exception e) { string msg = e.Message; using (StreamWriter sw = new StreamWriter("D://ThreadException.log", true)) { sw.WriteLine("================================"); sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); sw.WriteLine(msg); sw.Flush(); } } /// /// 主窗口 /// /// /// private void MainForm_Load(object sender, EventArgs e) { string s1 = "ECO4060##Coton20℃##Rapide15mns"; string s2 = "Eco4060##Coton20℃##Rapide15mns"; bool st = ManagerModelHelper.StrMatch2(s1, s2); //Rect rect = new Rect(0, 0, 0, 0); //string path2 = "D:\\Hisence\\SQLImages\\W80WXWJ060539V0WW80WX120293\\2\\W80WXWJ060539V0WW80WX120293result.jpg"; //Mat cameraMat = Cv2.ImRead(path2); //bool ifg = CheckDiffSciHelper.CheckDiffSci(path2, cameraMat, rect, rect, false, "D://Hisence//Test"); string vBarPath = "D:\\Hisence\\类型\\Lp\\202452414231.jpg"; string vCam1OnePath = "D:\\Hisence\\类型\\Lp\\001.jpg"; string vCam1TwoPath = "D:\\Hisence\\类型\\Lp\\002.jpg"; string vModelChangePath = "D:\\Hisence\\config\\chinese.json"; string LablePathstr = "D:\\Hisence\\ClassName.txt";//标签路径 string LablePathButtonstr = "D:\\Hisence\\ClassNameButton.txt";//标签路径 // Mat cameraMat = Cv2.ImRead(vCam1TwoPath); //Defet_OnDetectionDone(cameraMat, DefetShow1); // canvas1.ImagePath = vCam1TwoPath; // DefetShow.ImaMAt = cameraMat; if (File.Exists(LablePathButtonstr) && File.Exists(vBarPath) && File.Exists(vCam1OnePath) && File.Exists(vCam1TwoPath) && File.Exists(vModelChangePath)) { BarPath = vBarPath; Cam1OnePath = vCam1OnePath; Cam1TwoPath = vCam1TwoPath; ModelChangePath = vModelChangePath; } ifXZeroValue = XZerorbx.Checked; ifYZeroValue = YZerorbx.Checked; InitDevList(); this.WindowState = FormWindowState.Maximized; string Dectionstr = "D:\\Hisence\\best.onnx"; string DectionButtonstr = "D:\\Hisence\\HisenceButton.onnx"; string CountryStr = "D:\\Hisence\\config\\chinese.json"; if (File.Exists(LablePathstr) && File.Exists(Dectionstr) && File.Exists(CountryStr) && File.Exists(DectionButtonstr)) { LablePath = LablePathstr; } else { MessageBox.Show("检测" + Dectionstr + " " + CountryStr + " " + LablePathstr + "模型有无"); return; } //初始化检测驱动 simboObjectDetection.Load(Dectionstr, "CPU", "images", 640, 640); simboObjectDetButton.Load(DectionButtonstr, "CPU", "images", 640, 640); paddleOcrModelCountry.Load(CountryStr, "CPU"); paddleOcrModel.Load(CountryStr, "CPU"); IfChangeLanguage = CountryStr; MLRequest req = new MLRequest(); string path = "D:\\Hisence\\类型\\12\\202461417146451.jpg"; req.currentMat = Cv2.ImRead(path); string BarT = DetMachineBar(ref req); //相机配置 StartDecBtn.Enabled = false; myDelegateUI = new MyDelegateUI(initAll);//绑定委托 myPosDelegateUI = new MyPosDelegateUI(initAll2);//绑定委托 myLogDelegateUI = new MyLogDelegateUI(initAll3);//绑定委托 //初始化PLC melsecPLCTCPDriver.Start(); melsecPLCTCPDriver.Heartbeat -= PLcHeratAdress; melsecPLCTCPDriver.Heartbeat += PLcHeratAdress; OnSpeedShow();//线程开启将速度显示在界面上 OnPostionShow();//线程开启将位置显示在界面上 //t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒; //t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);//到达时间的时候执行事件; //t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); //t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; //t.Start(); //启动定时器 } public void Execute(object source, System.Timers.ElapsedEventArgs e) { t.Stop(); //先关闭定时器 //melsecPLCTCPDriver.WriteInt("548", 1); //Thread.Sleep(1000); //melsecPLCTCPDriver.WriteInt("548", 0); //myLog("写" + WriteAdress.Text.ToString() + "完成", DateTime.Now); MessageBox.Show("OK!"); t.Start(); //执行完毕后再开启器 } private string DetMachineBar(ref MLRequest req) { // req.currentMat = Cv2.ImRead("D:\\Hisence\\类型\\Lp\\202453015229201.jpg"); MLResult mL = paddleOcrModelCountry.RunInferenceFixed(req); // DisplayResult(mL); //相机识别的字符串 string IOcrBAr = string.Empty; string[] BarListOne = new string[10]; int Ypos = 0; int mid = 9999999; for (int v = 0; v < Enumerable.Count(mL.ResultDetails); v++) { if (mL.ResultDetails.Count() > 0) { int Pos = mL.ResultDetails[v].Rect.Y; if (Pos < mid) { mid = Pos; } } } for (int v = 0; v < Enumerable.Count(mL.ResultDetails); v++) { if (mL.ResultDetails.Count() > 0) { int Pos = mL.ResultDetails[v].Rect.Y; if (Math.Abs(Pos - mid) < 80) { string iv = mL.ResultDetails[v].LabelDisplay; string result = Regex.Replace(iv, "[ \\[ \\] \\^ \\-_*×――(^)$%~!@#$…&%¥—+=<>《》!!???::?`·、。,;,.;/\"‘’“”-]", ""); IOcrBAr += result; } else { continue; } } } //将第一行设置为BAr return IOcrBAr; } private void initAll() //信息处理函数定义 { //richTextBox1.AppendText("TEST line \r"); if (HspeedList.Count == 33) { lnEditmiXHS.Text = HspeedList[1].ToString(); lnEditmiYHS.Text = HspeedList[6].ToString(); lnEditmiZHS.Text = HspeedList[11].ToString(); //定位速度 lnEditmiXS.Text = HspeedList[0].ToString(); lnEditmiYS.Text = HspeedList[5].ToString(); lnEditmiZS.Text = HspeedList[10].ToString(); } if (disShow != 0) { //TODO实时公式 知道测距移动多少 double disreal = disShow * (-0.54054) + 1324.3232; DistanceShow.Text = Math.Ceiling(disreal).ToString(); //换算成一元一函数 //y = -0.54054x + 1324.3232 } } private void initAll2() //信息处理函数定义 { if (relPosStrList.Count == 31) { // XPostion.Text = ""; XPostion.Text = relPosStrList[0].ToString(); //YPostion.Text = ""; YPostion.Text = relPosStrList[5].ToString(); // ZPostion.Text = ""; ZPostion.Text = relPosStrList[10].ToString(); } } string Logtxt = ""; private void initAll3() //信息处理函数定义 { richTextBox1.AppendText(Logtxt); AllDSum.Text = AllDsums.ToString(); OKDNum.Text = OKDsums.ToString(); NGDNum.Text = NGDsums.ToString(); using (StreamWriter stream = new StreamWriter("D://information.log", true)) { stream.WriteLine(Logtxt); stream.Flush(); } } private void OnSpeedShow() { Task.Run(() => { while (true) { try { UpDatePlcValue(600, 2); //从404 地址 读33个地址 UpDatePlcValue(404, 33); if (HspeedList.Count == 33) { //手动速度 this.Invoke(myDelegateUI); //richTextBox1.AppendText("TEST line \r"); Application.DoEvents(); } if (disShow != 0) { this.Invoke(myDelegateUI); //richTextBox1.AppendText("TEST line \r"); Application.DoEvents(); } } catch (Exception ex) { } Thread.Sleep(200); } }); } private void OnPostionShow() { Task.Run(() => { while (true) { try { UpDatePlcValue(102, 31); if (relPosStrList.Count == 31) { this.Invoke(myPosDelegateUI); //richTextBox1.AppendText("TEST line \r"); Application.DoEvents(); } } catch (Exception ex) { } Thread.Sleep(200); } }); } /// /// 相机打开 /// /// /// private void CamOpenBtn_Click(object sender, EventArgs e) { Cam1.Start("Cam1"); bnGetParam.Enabled = true; SetCtrlWhenOpen(); Cam1OpenBtn.BackColor = Color.Green; } private void SetCtrlWhenOpen() { tbExposure.Enabled = true; tbGain.Enabled = true; // tbFrameRate.Enabled = true; bnGetParam.Enabled = true; bnSetParam.Enabled = true; } private void bnGetParam_Click(object sender, EventArgs e) { // tbExposure.Text = Cam1.dvpGetExposure().ToString(); // tbGain.Text = Cam1.dvpGetAnalogGain().ToString(); } private void bnGetParam2_Click(object sender, EventArgs e) { //tbExposure2.Text = Cam1.dvpGetExposure().ToString(); //tbGain2.Text = Cam1.dvpGetAnalogGain().ToString(); } /// /// 相机2打开 /// /// /// private void Cam2OpenBtn_Click(object sender, EventArgs e) { // Cam2.Start("Cam2"); // bnGetParam2.Enabled = true; // Cam2OpenBtn.BackColor = Color.Green; } private void button2_Click(object sender, EventArgs e) { Cam1.Stop(); SetCtrlWhenClose(); } private void SetCtrlWhenClose() { tbExposure.Enabled = false; tbGain.Enabled = false; // tbFrameRate.Enabled = false; bnGetParam.Enabled = false; bnSetParam.Enabled = false; } private void button3_Click(object sender, EventArgs e) { Cam2.Stop(); } /// /// 相机1软触发 /// /// /// private void SnapshotCam1_Click(object sender, EventArgs e) { Cam1.Snapshot(); } /// /// 相机2软触发 /// /// /// private void SnapshotCam2_Click(object sender, EventArgs e) { //Cam2.Snapshot(); } int TimesCalled = 0; Bitmap OKbitmap = new Bitmap("OK.jpg"); Bitmap NGbitmap = new Bitmap("NG.jpg"); Mat OKMat = Cv2.ImRead("OK.jpg"); Mat NGMat = Cv2.ImRead("OK.jpg"); /// /// 主线程调用 /// /// /// private void InitMachine_Click(object sender, EventArgs e) { try { //初始化相机 DataSet dataSet = SQLiteHelper.Query("select * from XK_HisenceDet"); //dataGridView1.DataSource = dataSet.Tables[0]; Cam1.Start("Cam1"); if (Cam1.IfSuccess) { myLog("Cam1相机启动", DateTime.Now); } Cam2.Start("Cam2"); if (Cam2.IfSuccess) { myLog("Cam2相机启动", DateTime.Now); } Cam1.OnHImageOutput -= OnCameraMatOutPut; Cam1.OnHImageOutput += OnCameraMatOutPut; Cam2.OnHImageOutput -= OnCameraMatOutPut2; Cam2.OnHImageOutput += OnCameraMatOutPut2; OKOrNGShow.Image = OKbitmap; //初始化扫码枪 //Scanner.Strart(); //Scanner.OnClientDataReceived -= OnDataReceived; //Scanner.OnClientDataReceived += OnDataReceived; //Scanner.btnSendMsg("LON\r");//发送开启指令 //myLog("发送恩士扫码枪开启指令", DateTime.Now); //PLC使能开启 melsecPLCTCPDriver.WriteInt("581", 0);//定位松开 melsecPLCTCPDriver.WriteInt("504", 0);//定位松开 melsecPLCTCPDriver.WriteInt("514", 0);//定位松开 melsecPLCTCPDriver.WriteInt("524", 0);//定位松开 melsecPLCTCPDriver.WriteInt("406", 60000); //写入手动速度 melsecPLCTCPDriver.WriteInt("416", 8000); melsecPLCTCPDriver.WriteInt("426", 10000); melsecPLCTCPDriver.WriteInt("404", 100000); //写入定位速度 melsecPLCTCPDriver.WriteInt("414", 8000); melsecPLCTCPDriver.WriteInt("424", 10000); melsecPLCTCPDriver.WriteInt("500", 0); melsecPLCTCPDriver.WriteInt("500", 1); Thread.Sleep(200); bOn = true; melsecPLCTCPDriver.WriteInt("580", 0);//归零 melsecPLCTCPDriver.WriteInt("580", 1);//归零 Thread.Sleep(200); melsecPLCTCPDriver.WriteInt("580", 0); Thread.Sleep(200); while (true) { int IfXZeros = melsecPLCTCPDriver.ReadInt("102"); int IfYZeros = melsecPLCTCPDriver.ReadInt("112"); int IfZZeros = melsecPLCTCPDriver.ReadInt("122"); if (IfXZeros <= 140 && IfYZeros <= 140 && IfZZeros <= 140) { StartDecBtn.Enabled = true; break; } Thread.Sleep(10); } myLog("设备全部启动完成", DateTime.Now); } catch (Exception ex) { Application_ThreadException(ex); } } /// /// 全图洗衣机 裁剪之后 OCR识别的结果 /// /// 全图图片 /// 全局图片上的目标定位结果(包括定位矩形框) /// 返回的定位框的结果 private void InsertSqlRunData2(ref Mat currentMatC, MLResult cam1TwoML, ref List strMatListList, ref PaddleOcrModel IOcrModel) { #if true try { List mats = new List(); Mat mResultCut = currentMatC.Clone(); string OcrTextinsert = ""; for (int i = 0; i < cam1TwoML.ResultDetails.Count; i++) { Mat mResultCuti = mResultCut.Clone(); int rectsx = cam1TwoML.ResultDetails[i].Rect.X; int rectsy = cam1TwoML.ResultDetails[i].Rect.Y; int rectsWidth = cam1TwoML.ResultDetails[i].Rect.Width; int rectsHeight = cam1TwoML.ResultDetails[i].Rect.Height; Rect area = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); Mat matroi = new Mat(mResultCuti, area); mats.Add(matroi); //OCR识别裁剪图片 MLRequest reqcut = new MLRequest(); reqcut.currentMat = matroi.Clone(); MLResult mLcut = paddleOcrModel.RunInference(reqcut); for (int j = 0; j < mLcut.ResultDetails.Count; j++) { string jdetial = mLcut.ResultDetails[j].LabelDisplay; string result = Regex.Replace(jdetial, "[ \\[ \\] \\^ \\-_*×――(^)$%~!@#$…&%¥—+=<>《》!!???::?`·、。,;,.;/\"‘’“”-]", ""); strMatListList.Add(result); OcrTextinsert += result + "##"; } } } catch (Exception ex) { } #endif } /// /// 数据库中条码所对应的OCR文本是否与识别出来的文本相似 /// /// /// /// private bool IsMatchOcrText(string WashBar, List DetMatstrList) { try { List strMatListListB = new List(); if (WashBar.Contains("##")) { string[] sArray = Regex.Split(WashBar, "##", RegexOptions.IgnoreCase); for (int i = 0; i < sArray.Count(); i++) { if (sArray[i] != "") { strMatListListB.Add(sArray[i]); } } } var firstNotSecond = DetMatstrList.Except(strMatListListB, StringComparer.OrdinalIgnoreCase).ToList(); var secondNotFirst = strMatListListB.Except(DetMatstrList, StringComparer.OrdinalIgnoreCase).ToList(); if (firstNotSecond.Count() == 0 && secondNotFirst.Count() == 0) { return true; } return false; } catch (Exception ex) { return false; } } private bool IsFuzzyMatchOcrText(string WashBar, List DetMatstrList) { try { List strMatListListB = new List(); if (WashBar.Contains("##")) { string[] sArray = Regex.Split(WashBar, "##", RegexOptions.IgnoreCase); for (int i = 0; i < sArray.Count(); i++) { if (sArray[i] != "") { strMatListListB.Add(sArray[i]); } } } var firstNotSecond = DetMatstrList.Intersect(strMatListListB, StringComparer.OrdinalIgnoreCase).ToList(); //var secondNotFirst = strMatListListB.Except(DetMatstrList, StringComparer.OrdinalIgnoreCase).ToList(); if (firstNotSecond.Count() > (strMatListListB.Count) / 2) { return true; } return false; } catch (Exception ex) { return false; } } /// /// 实时移动模组 /// public void MoveToP(int currentXP, int currentYP, int currentZP) { melsecPLCTCPDriver.WriteInt("581", 0); melsecPLCTCPDriver.WriteInt("402", currentXP); melsecPLCTCPDriver.WriteInt("412", currentYP); melsecPLCTCPDriver.WriteInt("422", currentZP); melsecPLCTCPDriver.WriteInt("581", 1); Thread.Sleep(200); melsecPLCTCPDriver.WriteInt("581", 0); while (true) { int IfXZeros = melsecPLCTCPDriver.ReadInt("102"); int IfYZeros = melsecPLCTCPDriver.ReadInt("112"); int IfZZeros = melsecPLCTCPDriver.ReadInt("122"); if ((IfXZeros < currentXP + 20) && (IfXZeros > currentXP - 20) && (IfYZeros <= currentYP + 20) && (IfYZeros >= currentYP - 20) && (IfZZeros <= currentZP + 20) && (IfZZeros >= currentZP - 20))//TODO:设置第一次拍摄的位置 { break; } Thread.Sleep(10); } } public int disShow = new int(); public List MonitorValues { get; set; } = new List(); public List relPosStrList { get; set; } = new List(); public List HspeedList { get; set; } = new List(); /// /// 实时刷新PLC地址的值 /// /// public void UpDatePlcValue(int Address, int length) { //Task.Run(() => //{ // while (true) // { try { //实时刷新机械手的位置 List newValues = melsecPLCTCPDriver.GetMonitorValues(Address, length); if (newValues == null || newValues.Count == 0) return; Stopwatch sw = new Stopwatch(); sw.Start(); if (Address == 600) { disShow = melsecPLCTCPDriver.ReadInt(Convert.ToString(Address)); } if (Address == 102) //若起始地址为102 { if (relPosStrList.Count == newValues.Count) { var tempNew = new List(newValues); var tempOld = new List(relPosStrList); //MonitorCheckAndInvoke(tempNew, tempOld); } relPosStrList = new List(newValues); // relPosStrList = MonitorValues; //实时显示在界面上 } if (Address == 404) { if (HspeedList.Count == newValues.Count) { var tempNew = new List(newValues); var tempOld = new List(HspeedList); //MonitorCheckAndInvoke(tempNew, tempOld); } HspeedList = new List(newValues); //HspeedList = MonitorValues; //实时显示在界面上 } sw.Stop(); if (sw.ElapsedMilliseconds > 20) { //LogAsync(DateTime.Now, LogLevel.Detail, $"{this.Name}轮询时间:{sw.ElapsedMilliseconds}"); } Thread.Sleep(20); } catch (Exception ex) { } // } //}); } /// /// 监听洗衣机545是否触发后面对射传感器 相机 /// public void TrigerCamera1() { //开启一个线程监听PLC得值 Task.Run(() => { int iNum1 = 0; int iNum0 = 0; while (true) { // myResetEvent.Set(); PLC545 = true; int m_iCureent545 = melsecPLCTCPDriver.ReadInt("545"); ////int m_iCureent545 = CMPLC.SLMPReadD(545); if (m_iCureent545 != 1) { iNum0++; } else { iNum0 = 0; } if (iNum0 >= 5) { while (true) { m_iCureent545 = melsecPLCTCPDriver.ReadInt("545"); if (m_iCureent545 == 1) { iNum1++; } else { iNum1 = 0; } if (iNum1 >= 5) { //Console.WriteLine("第二次采集图像"); //Cam1.Snapshot(); //Cam2.Snapshot(); //IfCam1Triger = false; //IfCam2Triger = false; iNum0 = 0; iNum1 = 0; break; } } } Thread.Sleep(100); } }); } /// /// 获取基恩士读码器的型号 /// public void OnGetBar() { Task.Run(() => { int iNum0 = 0; int iNum1 = 0; // const char pCR[4] = { 0x4C, 0x4F, 0x4E, 0x0D };开启 //const char pOFF[5] = { 0x4C, 0x4F, 0x46, 0x46, 0x0D };关闭 Thread.CurrentThread.Priority = ThreadPriority.Highest; while (true) { //545触发时为0 // myResetEvent.Set(); PLC545 = true; int m_iCureent545 = melsecPLCTCPDriver.ReadInt("545"); if (m_iCureent545 != 1) { iNum0++; } else { iNum0 = 0; } if (iNum0 >= 1) { //接受条码指令 while (true) { bTriger = false; //读到544一直是1持续两s 拍照 m_iCureent545 = melsecPLCTCPDriver.ReadInt("545"); if (m_iCureent545 == 1) { iNum1++; } else { iNum1 = 0; } if (iNum1 >= 2) { if (bBar) { bBarTriger = true;//修改成相机拍照获取型号 Cam2.SnapshotCount = 0; Cam2.Snapshot(); xKNow = GetModeFromBar("VWJ070633V0WW80F0120356");//从数据库中查询到这个条码的四轴的值 //xKNow = GetModeFromBar(m_sKEYENCEBar);//从数据库中查询到这个条码的四轴的值 if (Regex.IsMatch(xKNow.MoveX.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveY.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveZ.ToString(), @"^[0-9]+$")) { myLog("型号匹配成功" + m_sKEYENCEBar, DateTime.Now); bBarTriger = true; //MoveToP(xKNow.MoveX, xKNow.MoveY, xKNow.MoveZ);// PLC控制电机移动四轴 } break; } Thread.Sleep(2); bBar = false; } } } } Thread.Sleep(10); }); } #region 显示结果 /// /// 显示结果 /// /// private void DisplayResult(MLResult detectResult) { string displayTxt = ""; detectResult.ResultDetails.ForEach(d => { displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n"; }); var resultMask = detectResult.ResultMap; //Clone(new Rectangle(0, 0, detectResult.VisionImageSet.DetectionResultImage.Width, detectResult.VisionImageSet.DetectionResultImage.Height), detectResult.VisionImageSet.DetectionResultImage.PixelFormat); // List detectionResultShapes = new List(detectResult.DetectionResultShapes); DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult.ResultDetails, resultMask, displayTxt); // detectionResultShapes.Add(resultDisplay); Graphics g = Graphics.FromImage(resultMask); resultDisplay.Draw(g); // resultMask.Save("D://save.png"); // var resultMap = GetResultImage(resultMask, detectionResultShapes); } #endregion int YPos = 8715; int ZPos = 25000; /// /// 监听洗衣机544是否触发后面对射传感器 相机 /// public void TriggerCameral2() { //开启一个线程监听PLC得值 Task.Run(() => { try { int iNum1 = 0; int iNum0 = 0; Thread.CurrentThread.Priority = ThreadPriority.Highest; while (true) { // myResetEvent.Set(); PLC548 = true; int m_iCureent548 = melsecPLCTCPDriver.ReadInt("548"); if (m_iCureent548 != 0) { iNum0++; } else { iNum0 = 0; } if (iNum0 >= 1) { while (true) { bTriger = false; //读到544一直是1持续两s 拍照 m_iCureent548 = melsecPLCTCPDriver.ReadInt("548"); if (m_iCureent548 == 0) { iNum1++; } else { iNum1 = 0; } if (iNum1 >= 2) { //if (bBarTriger) { #if true myLog("第一次采集图像", DateTime.Now); //移动模组 读三次测距的地址 看是否往前移动 MoveToP(5815, YPos, ZPos); // Thread.Sleep(2000);//删 List DisList = new List(); for (int i = 0; i < 5; i++) { int m600 = melsecPLCTCPDriver.ReadInt("600"); DisList.Add(m600); } DisList.Remove(DisList.Max()); DisList.Remove(DisList.Min()); // 计算剩余值的平均数 double average = DisList.Average(); double disreal = average * (-0.54054) + 1324.3232; //测距距离-标准距离=要移动的距离 double dismove = disreal - 876; if (dismove > 0 && dismove < 4000) { MoveToP(5815, YPos, ZPos + (int)(dismove)); } //Thread.Sleep(2000);//删 // Thread.Sleep(500); Cam1.SnapshotCount = 0; Cam1.Snapshot(); Cam2.SnapshotCount = 0; Cam2.Snapshot(); myLog("第二次采集图像", DateTime.Now); //if (xKNow != null) //{ // MoveToP(xKNow.MoveTwoX, xKNow.MoveTwoY, xKNow.MoveTwoZ); //} //currentXP = 54964; //Thread.Sleep(2000);//删 MoveToP(51043, YPos, ZPos + (int)(dismove)); Cam1.Snapshot(); MoveToP(5815, YPos, ZPos); //if (xKNow != null) //{ // MoveToP(xKNow.MoveX, xKNow.MoveY, xKNow.MoveZ); //} myLog("采集图像成功", DateTime.Now); //模组复位 bTriger = true;//可以进行检测识别了 bBarTriger = false;//读码器可以不工作了 iNum0 = 0; iNum1 = 0; break; #else myLog("第一次采集图像", DateTime.Now); //移动模组 读三次测距的地址 看是否往前移动 //MoveToP(5815, YPos, ZPos); Thread.Sleep(1000);//删 //List DisList = new List(); //for (int i = 0; i < 5; i++) //{ // int m600 = melsecPLCTCPDriver.ReadInt("600"); // DisList.Add(m600); //} //DisList.Remove(DisList.Max()); //DisList.Remove(DisList.Min()); //// 计算剩余值的平均数 //double average = DisList.Average(); //double disreal = average * (-0.54054) + 1324.3232; ////测距距离-标准距离=要移动的距离 //double dismove = disreal - 876; //if (dismove > 0 && dismove < 4000) //{ // MoveToP(5815, YPos, ZPos + (int)(dismove)); //} Thread.Sleep(1000);//删 // Thread.Sleep(500); Cam1.SnapshotCount = 0; Cam1.Snapshot(); // Cam2.SnapshotCount = 0; //Cam2.Snapshot(); IfCam2Triger = true; myLog("第二次采集图像", DateTime.Now); //if (xKNow != null) //{ // MoveToP(xKNow.MoveTwoX, xKNow.MoveTwoY, xKNow.MoveTwoZ); //} //currentXP = 54964; Thread.Sleep(2000);//删 //MoveToP(51043, YPos, ZPos + (int)(dismove)); Cam1.Snapshot(); //MoveToP(5815, YPos, ZPos); //if (xKNow != null) //{ // MoveToP(xKNow.MoveX, xKNow.MoveY, xKNow.MoveZ); //} myLog("采集图像成功", DateTime.Now); //模组复位 bTriger = true;//可以进行检测识别了 bBarTriger = false;//读码器可以不工作了 iNum0 = 0; iNum1 = 0; break; #endif } } } } Thread.Sleep(10); } } catch (Exception e) { } }); } /// /// PLC心跳监听 /// /// public void PLcHeratAdress(int ifPlcHeart) { if (ifPlcHeart == 1) { txtSetValue.Text = "PLC监听失败" + " 时间:" + DateTime.Now.ToString(); myLog("PLC监听失败", DateTime.Now); PLCPowerON.BackColor = Color.Red; } else { PLCPowerON.BackColor = Color.Green; } } /// /// 机1软触发的回调 /// /// /// /// public void OnCameraMatOutPut(DateTime dt, Mat cameraMat, int SnapshotCount) { string fitImageFolder = "D://cam1//"; if (!Directory.Exists(fitImageFolder)) { Directory.CreateDirectory(fitImageFolder); } //第一次拍照 if (SnapshotCount == 1) { // Cam1ImgOne = Cv2.ImRead("D:\\Hisence\\类型\\1\\202461817464661.jpg"); ; Cam1ImgOne = cameraMat; IfCam1OneTriger = true; originMatShow.Image = cameraMat.ToBitmap(); //pictureBox1.Image = cameraMat.ToBitmap(); } //第二次拍照 if (SnapshotCount == 2) { //Mat mat = Cv2.ImRead("D:\\Hisence\\类型\\1\\002.jpg"); //Cam1ImgTwo = mat; Cam1ImgTwo = cameraMat; IfCam1TwoTriger = true; originMatShow2.Image = cameraMat.ToBitmap(); } //CamShow1.ImaMAt = cameraMat; cameraMat.ImWrite(fitImageFolder + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "1.jpg"); } /// /// 相机2触发回调 /// /// /// /// public void OnCameraMatOutPut2(DateTime dt, Mat cameraMat, int SnapshotCount) { string fitImageFolder = "D://cam2//"; if (!Directory.Exists(fitImageFolder)) { Directory.CreateDirectory(fitImageFolder); } // Mat mat = Cv2.ImRead("F:\\海信洗衣机\\cam1\\2024517161641.jpg"); Cam2ImgShowBar = cameraMat; IfCam2Triger = true; originMat2Show.Image = cameraMat.ToBitmap(); // CamShow2.ImaMAt = cameraMat; cameraMat.ImWrite(fitImageFolder + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "1.jpg"); } public volatile int AllDsums = 0; public volatile int NGDsums = 0; public volatile int OKDsums = 0; /// /// 开始识别 /// public void ReadyDetect() { Task.Run((Action)(() => { Thread.CurrentThread.Priority = ThreadPriority.Highest; while (true) { try { //相机2第一次拍照 if (IfCam2Triger) { IfCam2Triger = false; //OCR识别 MLRequest req = new MLRequest(); req.currentMat = Cam2ImgShowBar; //req.currentMat = Cv2.ImRead("D:\\Hisence\\类型\\1\\bar.jpg"); //相机识别的字符串 string IOcrBAr = DetMachineBar(ref req); DateTime dt = DateTime.Now; using (StreamWriter sw = new StreamWriter("D://Hisence//logsBar.log", true)) { string filename = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString(); sw.WriteLine(filename + "\n"); sw.WriteLine(IOcrBAr + "\n"); sw.Flush(); } IOcrBAr = "BatchW825UModelWNHEI74SAS"; //根据条码数据库比对 xKNow = GetModeFromBar(IOcrBAr);//从数据库中查询到这个条码的四轴的值 List xkWordList = ManagerModelHelper.GetModeWordFromBar(IOcrBAr); if (xkWordList.Count() == 1) { xK_HisenceSQLWord = xkWordList[0]; } if (xKNow.OcrBar == null) { myLog("未匹配成功" + IOcrBAr, DateTime.Now); break; } if (xKNow.Detect != "") { ////此时运行的洗衣机是和之前一个语言模型 //if (IfChangeLanguage == IOcrBAr) //{ //} //else //{ // //本地存在这个OCR.josn参数 // if (File.Exists(xKNow.OcrParm)) // { // paddleOcrModel.Load(xKNow.OcrParm, "CPU"); // IfChangeLanguage = IOcrBAr; // } //} myLog("型号匹配成功" + IOcrBAr, DateTime.Now); bBarTriger = true; } //从数据库中匹配完才可以进行模组移动 //如果这次型号和上次的型号一样 就不用换识别模型ll } //相机1第二次拍照 if (IfCam1TwoTriger && bBarTriger) { XK_HisenceWord xK_MatchDet = new XK_HisenceWord(); xK_MatchDet.TwoIFWhile = xK_HisenceSQLWord.TwoIFWhile; AllDsums++; //进行推理 MLRequest req = new MLRequest(); req.currentMat = Cam1ImgOne; req.ResizeWidth = 640; req.ResizeHeight = 640; req.Score = 0.3f; req.in_lable_path = LablePath;//标签路径 req.confThreshold = 0.3f;//模型置信度 req.iouThreshold = 0.4f;//检测IOU req.out_node_name = "output"; MLResult mL = simboObjectDetection.RunInferenceFixed(req); MLResult mLButton = simboObjectDetButton.RunInferenceFixed(req); DateTime dt = DateTime.Now; //将所有的块裁剪 识别字符对比字符串 List strMatListOne = new List(); List strMatFuzzyListOne = new List(); Mat mResultCut = req.currentMat.Clone(); Mat mCut = new Mat(); Stopwatch sw = new Stopwatch(); sw.Start(); Dictionary keyValueResult = new Dictionary(); InsertSqlRunDataButton(ref keyValueResult, false, ref mCut, ref mResultCut, mL, mLButton, ref xK_HisenceSQLWord, ref xK_MatchDet, ref strMatListOne, ref strMatFuzzyListOne, ref paddleOcrModel); sw.Stop(); myLog("插入面板时间" + sw.ElapsedMilliseconds, DateTime.Now); if (mL.ResultMap != null) { mL.ResultMap.Save("D://cam1//" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "1result.jpg"); ResultMatShow.Image = mL.ResultMap; } //进行推理 MLRequest req2 = new MLRequest(); req2.currentMat = Cam1ImgTwo; req2.ResizeWidth = 640; req2.ResizeHeight = 640; req2.Score = 0.3f; req2.in_lable_path = LablePath;//标签路径 req2.confThreshold = 0.3f;//模型置信度 req2.iouThreshold = 0.4f;//检测IOU req2.out_node_name = "output"; MLResult mL2 = simboObjectDetection.RunInferenceFixed(req2); List strMatListTwo = new List(); List strMatFuzzyListTwo = new List(); Mat mResultCut2 = req2.currentMat.Clone(); Dictionary keyValueResult2 = new Dictionary(); InsertSqlRunData(ref keyValueResult2, false, ref mResultCut2, mL2, ref xK_HisenceSQLWord, ref xK_MatchDet, ref strMatListTwo, ref strMatFuzzyListTwo, ref paddleOcrModel); if (mL2.ResultMap != null) { mL2.ResultMap.Save("D://cam1//" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "2result.jpg"); ResultMatShow2.Image = mL2.ResultMap; } //执行定位数组块 string[] listLabels = xKNow.Detect.Split(","); MLResult MLsum = mL; for (int i = 0; i < mL2.ResultDetails.Count; i++) { MLsum.ResultDetails.Add((DetectionResultDetail)mL2.ResultDetails[i]); } string[] RealLabels = new string[MLsum.ResultDetails.Count]; string detstr = ""; for (int i = 0; i < MLsum.ResultDetails.Count; i++) { RealLabels[i] = MLsum.ResultDetails[i].LabelName; if (i < MLsum.ResultDetails.Count - 1) { detstr += RealLabels[i] + ","; } else { detstr += RealLabels[i]; } } ///执行比对 小图 //bool MatchStr = ManagerModelHelper.IsMatchSQLText(ref mCut, ref xK_HisenceSQLWord, ref xK_MatchDet); bool MatchStr = true; keyValueResult.ForEach(x => { if (x.Value == false) { MatchStr = false; return; } }); keyValueResult2.ForEach(x => { if (x.Value == false) { MatchStr = false; return; } }); IfCam1TwoTriger = false; bBarTriger = false; if (MatchStr) { OKDsums++; myLog("匹配成功", DateTime.Now); //界面显示 // InsertXK_HisenceWordMatchData(xK_MatchDet, true); this.Invoke(new Action(() => { OKOrNGShow.Image = OKbitmap; })); } else { NGDsums++; myLog("匹配失败", DateTime.Now); //界面显示 // InsertXK_HisenceWordMatchData(xK_MatchDet, false); this.Invoke(new Action(() => { OKOrNGShow.Image = NGbitmap; })); } } } catch (Exception e) { } finally { } Thread.Sleep(10); } })); } /// /// 根据条码从数据库中获取型号 /// /// /// public XKHisence GetModeFromBar(string SkBar) { //从模板库里读 DataSet ds = SQLiteHelper.Query($"select * from XK_Hisence where OCRBar='{SkBar}' "); XKHisence XK_hisence = new XKHisence(); //cbx.DataSource = ds; DataTableReader rdr = ds.CreateDataReader(); //autxRecords = new List(); //cbx.Rows.Clear(); while (rdr.Read())//读取表中数据 { // xKOCROfficeWord.ID = (int)rdr["ID"]; XK_hisence.Type = (string)rdr["Type"]; XK_hisence.OcrBar = (string)rdr["OcrBar"]; XK_hisence.MoveX = (int)rdr["MoveX"]; XK_hisence.MoveY = (int)rdr["MoveY"]; XK_hisence.MoveZ = (int)rdr["MoveZ"]; XK_hisence.Detect = (string)rdr["Detect"]; XK_hisence.OcrText = (string)rdr["OcrText"]; XK_hisence.MoveTwoX = (int)rdr["MoveTwoX"]; XK_hisence.MoveTwoY = (int)rdr["MoveTwoY"]; XK_hisence.MoveTwoZ = (int)rdr["MoveTwoZ"]; XK_hisence.OcrParm = (string)rdr["OcrParm"]; XK_hisence.Language = (string)rdr["Language"]; XK_hisence.FuzzyOcrText = (string)rdr["FuzzyOcrText"]; //xKHisences.Add(XK_hisence); return XK_hisence; //additem(XK_hisence); } return XK_hisence; } /// /// 接受条码的回调函数 /// /// public void OnDataReceived(byte[] data) { // if (data.Length > 10) { m_sKEYENCEBar = System.Text.Encoding.UTF8.GetString(data); // myLog("型号Ocr" + m_sKEYENCEBar, DateTime.Now); bBar = true; } } /// /// PLC的初始化 /// /// /// private void button4_Click(object sender, EventArgs e) { melsecPLCTCPDriver.Start(); myLog("连接PLC成功", DateTime.Now); } /// /// 日志 /// /// /// private void myLog(string txt, DateTime date) { Logtxt = txt + " 时间:" + date.ToString() + "\n"; this.Invoke(myLogDelegateUI); //richTextBox1.AppendText("TEST line \r"); Application.DoEvents(); } private void readAdress_Click(object sender, EventArgs e) { if (Regex.IsMatch(readPLc.Text.ToString(), @"^[0-9]+$")) { int m_iCureent545 = melsecPLCTCPDriver.ReadInt(readPLc.Text.ToString()); showPLC.Text = m_iCureent545.ToString(); myLog("读取" + readPLc.Text.ToString() + "完成", DateTime.Now); } } private void wirteAdress_Click(object sender, EventArgs e) { try { if (Regex.IsMatch(WriteAdress.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(PLCValue.Text.ToString(), @"^[0-9]+$")) { melsecPLCTCPDriver.WriteInt(WriteAdress.Text.ToString(), Convert.ToInt16(PLCValue.Text)); myLog("写" + WriteAdress.Text.ToString() + "完成", DateTime.Now); } } catch (Exception ex) { } } private void ScanDevList_Click(object sender, EventArgs e) { InitDevList(); } private void PLCPowerON_Click(object sender, EventArgs e) { if (bOn == true) { melsecPLCTCPDriver.WriteInt("500", 0); // PLCcontrol->WritePlc(500, 0); bOn = false; PLCPowerON.Text = "使能On"; myLog("下使能", DateTime.Now); PLCPowerON.BackColor = Color.Red; } else { melsecPLCTCPDriver.WriteInt("581", 0);//定位松开 melsecPLCTCPDriver.WriteInt("504", 0);//定位松开 melsecPLCTCPDriver.WriteInt("514", 0);//定位松开 melsecPLCTCPDriver.WriteInt("524", 0);//定位松开 melsecPLCTCPDriver.WriteInt("406", 60000); //写入手动速度 melsecPLCTCPDriver.WriteInt("416", 8000); melsecPLCTCPDriver.WriteInt("426", 10000); melsecPLCTCPDriver.WriteInt("404", 100000); //写入定位速度 melsecPLCTCPDriver.WriteInt("414", 8000); melsecPLCTCPDriver.WriteInt("424", 10000); melsecPLCTCPDriver.WriteInt("500", 0); melsecPLCTCPDriver.WriteInt("500", 1); melsecPLCTCPDriver.WriteInt("500", 1); bOn = true; PLCPowerON.Text = "使能Off"; PLCPowerON.BackColor = Color.Green; myLog("上使能", DateTime.Now); } } bool IfPLCDiskZero = false; bool IfPLCPostion = false; private void PLCDiskZero_Click(object sender, EventArgs e) { //if (!IfPLCDiskZero) //{ melsecPLCTCPDriver.WriteInt("580", 0); //归零 melsecPLCTCPDriver.WriteInt("580", 1); Thread.Sleep(200); melsecPLCTCPDriver.WriteInt("580", 0); IfPLCDiskZero = true; this.txtSetValue.Text = "1"; myLog("580开始归零", DateTime.Now); //} //else //{ // melsecPLCTCPDriver.WriteInt("580", 0); // IfPLCDiskZero = false; // this.txtSetValue.Text = "0"; // myLog("580停止归零", DateTime.Now); //} } private void PLCPostion_Click(object sender, EventArgs e) { //if (!IfPLCPostion) //{ try { if (Regex.IsMatch(lnEditmiXOP.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiYOP.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiZOP.Text.ToString(), @"^[0-9]+$")) { if (lnEditmiXOP.Text != "" && lnEditmiYOP.Text != "" && lnEditmiZOP.Text != "") { //通过读取编辑栏的数值 作为目标位置 int iXTPosition = Convert.ToInt16(lnEditmiXOP.Text); //定位X轴位置 int iYTPosition = Convert.ToInt16(lnEditmiYOP.Text); int iZTPosition = Convert.ToInt16(lnEditmiZOP.Text); //把要定位的位置写入 melsecPLCTCPDriver.WriteInt("402", iXTPosition); melsecPLCTCPDriver.WriteInt("412", iYTPosition); melsecPLCTCPDriver.WriteInt("422", iZTPosition); string logs = "写入定位位置 X" + iXTPosition + "Y:" + iYTPosition + "Z:" + iZTPosition + " "; myLog(logs, DateTime.Now); } } melsecPLCTCPDriver.WriteInt("581", 1); Thread.Sleep(1000); melsecPLCTCPDriver.WriteInt("581", 0); IfPLCPostion = true; this.txtSetValue.Text = "1"; myLog("XYZ开始定位581", DateTime.Now); } catch (Exception ex) { } //} //else //{ // melsecPLCTCPDriver.WriteInt("581", 0); // IfPLCPostion = false; // this.txtSetValue.Text = "0"; // myLog("XYZ停止581", DateTime.Now); //} } private void StartDecBtn_Click(object sender, EventArgs e) { //OnGetBar(); TriggerCameral2(); ReadyDetect(); myLog("开启流程成功", DateTime.Now); } private void InsertSqlBtn_Click(object sender, EventArgs e) { } private void RefeshData_Click(object sender, EventArgs e) { DataSet dataSet = SQLiteHelper.Query("select * from XK_HisenceDet"); //dataGridView1.DataSource = dataSet.Tables[0]; } private void panel8_Paint(object sender, PaintEventArgs e) { } private void SetHandleSpeed_Click(object sender, EventArgs e) { if (Regex.IsMatch(lnEditmiXHS.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiYHS.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiZHS.Text.ToString(), @"^[0-9]+$")) { if (SetlnEditmiXH.Text != "" && SetlnEditmiYH.Text != "" && SetlnEditmiZH.Text != "") { int XHspeed = Convert.ToInt32(SetlnEditmiXH.Text); //X轴手动速度 int YHspeed = Convert.ToInt32(SetlnEditmiYH.Text); //Y轴手动速度 int ZHspeed = Convert.ToInt32(SetlnEditmiZH.Text); //Z轴手动速度 melsecPLCTCPDriver.WriteInt("406", XHspeed); //写入手动速度 melsecPLCTCPDriver.WriteInt("416", YHspeed); melsecPLCTCPDriver.WriteInt("426", ZHspeed); string logs = "写入手动速度 X" + XHspeed + "Y:" + YHspeed + "Z:" + ZHspeed + " "; myLog(logs, DateTime.Now); } } } private void SetAutoSpeed_Click(object sender, EventArgs e) { if (Regex.IsMatch(lnEditmiXS.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiYS.Text.ToString(), @"^[0-9]+$") && Regex.IsMatch(lnEditmiZS.Text.ToString(), @"^[0-9]+$")) { if (SetlnEditmiXOP.Text != "" && SetlnEditmiYOP.Text != "" && SetlnEditmiZOP.Text != "") { int Xspeed = Convert.ToInt32(SetlnEditmiXOP.Text); //X轴定位速度 int Yspeed = Convert.ToInt32(SetlnEditmiYOP.Text); //Y轴定位速度 int Zspeed = Convert.ToInt32(SetlnEditmiZOP.Text); //Z轴定位速度 melsecPLCTCPDriver.WriteInt("404", Xspeed); //写入定位速度 melsecPLCTCPDriver.WriteInt("414", Yspeed); melsecPLCTCPDriver.WriteInt("424", Zspeed); string logs = "写入定位速度 X" + Xspeed + "Y:" + Yspeed + "Z:" + Zspeed + " "; myLog(logs, DateTime.Now); } } } //按下状态标识 private bool m_btnState; private void YZerorbx_Click(object sender, EventArgs e) { if (!ifYZeroValue) { this.YZerorbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("513", 1); ifYZeroValue = true; this.txtSetValue.Text = "1"; myLog("Y轴开始归零", DateTime.Now); } else { this.YZerorbx.Checked = false; melsecPLCTCPDriver.WriteInt("513", 0); ifYZeroValue = false; this.txtSetValue.Text = "0"; myLog("Y轴停止归零", DateTime.Now); } } private void ZZerorbx_Click(object sender, EventArgs e) { if (!ifZZeroValue) { this.ZZerorbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("523", 1); ifZZeroValue = true; this.txtSetValue.Text = "1"; myLog("Z轴开始归零", DateTime.Now); } else { this.ZZerorbx.Checked = false; melsecPLCTCPDriver.WriteInt("523", 0); ifZZeroValue = false; this.txtSetValue.Text = "0"; myLog("Z轴停止归零", DateTime.Now); } } private void XForwardrbx_Click(object sender, EventArgs e) { if (!ifXForward) { this.XForwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("502", 1); ifXForward = true; this.txtSetValue.Text = "1"; myLog("X轴开始正向", DateTime.Now); } else { this.XForwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("502", 0); ifXForward = false; this.txtSetValue.Text = "0"; myLog("X轴停止正向", DateTime.Now); } } private void YForwardrbx_Click(object sender, EventArgs e) { if (!ifYForward) { this.YForwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("512", 1); ifYForward = true; this.txtSetValue.Text = "1"; myLog("Y轴开始正向", DateTime.Now); } else { this.YForwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("512", 0); ifYForward = false; this.txtSetValue.Text = "0"; myLog("Y轴停止正向", DateTime.Now); } } private void ZForwardrbx_Click(object sender, EventArgs e) { if (!ifZForward) { this.ZForwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("522", 1); ifZForward = true; this.txtSetValue.Text = "1"; myLog("Z轴开始正向", DateTime.Now); } else { this.ZForwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("522", 0); ifZForward = false; this.txtSetValue.Text = "0"; myLog("Z轴停止正向", DateTime.Now); } } private void XBackwardrbx_Click(object sender, EventArgs e) { if (!ifXBackward) { this.XBackwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("501", 1); ifXBackward = true; this.txtSetValue.Text = "1"; myLog("X轴开始反向", DateTime.Now); } else { this.XBackwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("501", 0); ifXBackward = false; this.txtSetValue.Text = "0"; myLog("X轴停止反向", DateTime.Now); } } private void YBackwardrbx_Click(object sender, EventArgs e) { if (!ifYBackward) { this.YBackwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("511", 1); ifYBackward = true; this.txtSetValue.Text = "1"; myLog("Y轴开始反向", DateTime.Now); } else { this.YBackwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("511", 0); ifYBackward = false; this.txtSetValue.Text = "0"; myLog("Y轴停止反向", DateTime.Now); } } private void ZBackwardrbx_Click(object sender, EventArgs e) { if (!ifZBackward) { this.ZBackwardrbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("521", 1); ifZBackward = true; this.txtSetValue.Text = "1"; myLog("Z轴开始反向", DateTime.Now); } else { this.ZBackwardrbx.Checked = false; melsecPLCTCPDriver.WriteInt("521", 0); ifZBackward = false; this.txtSetValue.Text = "0"; myLog("Z轴停止反向", DateTime.Now); } } private void button1_Click(object sender, EventArgs e) { string ss = "BB0VA5E0000BCQ5L0114"; } private void Cam2OpenBtn_Click_1(object sender, EventArgs e) { Cam2.Start("Cam2"); bnGetParam2.Enabled = true; //SetCtrlWhenOpen(); Cam2OpenBtn.BackColor = Color.Green; } private void button4_Click_1(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "请打开图片"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string fName = openFileDialog.FileName; //File fileOpen = new File(fName); //isFileHaveName = true; //richTextBox1.Text = fileOpen.ReadFile(); //richTextBox1.AppendText(""); DetectBArMatbox.Text = fName; BarPath = fName; } } #region 插入新型号 private void InsertBtn_Click(object sender, EventArgs e) { try { string type = TypeBox.Text; string OcrBar = OcrBarBox.Text; string moveX = moveXbox.Text; string moveY = moveYbox.Text; string moveZ = moveZbox.Text; string Detect = DetectBArMatbox.Text; string movetwoX = moveTwoXbox.Text; string movetwoY = moveTwoYbox.Text; string movetwoZ = moveTwoZbox.Text; bool whiteBan = true; if (WhiteBanCbx.CheckState == CheckState.Checked)//选中 { whiteBan = true; } else if (WhiteBanCbx.CheckState == CheckState.Unchecked)//没选中 { whiteBan = false; } else { whiteBan = false; } if (!Regex.IsMatch(moveX, @"^[0-9]+$")) { MessageBox.Show("第一次拍照移动的X只能是数字"); return; } if (!Regex.IsMatch(moveY, @"^[0-9]+$")) { MessageBox.Show("第一次拍照移动的Y只能是数字"); return; } if (!Regex.IsMatch(moveZ, @"^[0-9]+$")) { MessageBox.Show("第一次拍照移动的Z只能是数字"); return; } if (!Regex.IsMatch(movetwoX, @"^[0-9]+$")) { MessageBox.Show("第二次拍照移动的X只能是数字"); return; } if (!Regex.IsMatch(movetwoY, @"^[0-9]+$")) { MessageBox.Show("第二次拍照移动的Y只能是数字"); return; } if (!Regex.IsMatch(movetwoZ, @"^[0-9]+$")) { MessageBox.Show("第二次拍照移动的Z只能是数字"); return; } if (Detect != "" && BarPath != "" && Cam1OnePath != "" && Cam1TwoPath != "" && ModelChangePath != "") { int HmoveX = (int)Convert.ToInt64(moveX); int HmoveY = (int)Convert.ToInt64(moveY); int HmoveZ = (int)Convert.ToInt64(moveZ); int HmovetwoX = (int)Convert.ToInt64(movetwoX); int HmovetwoY = (int)Convert.ToInt64(movetwoY); int HmovetwoZ = (int)Convert.ToInt64(movetwoZ); InsertXK_Hisence(whiteBan, HmoveX, HmoveY, HmoveZ, HmovetwoX, HmovetwoY, HmovetwoZ); } else { MessageBox.Show("插入的数据不能为NULL"); } } catch (Exception es) { MessageBox.Show(es.Message); } } public void InsertXK_Hisence(bool ifwhiteBan, int MoveX, int MoveY, int MoveZ, int MoveTwoX, int MoveTwoY, int MoveTwoZ) { PaddleOcrModel IpaddleOcrModel = new PaddleOcrModel(); IpaddleOcrModel.Load(ModelChangePath, "CPU"); //用中文文模型来识别条码 MLRequest OcrBari = new MLRequest(); OcrBari.currentMat = Cv2.ImRead(BarPath); string IOcrBAr = DetMachineBar(ref OcrBari); XK_HisenceWord xkWord = new XK_HisenceWord(); xkWord.OcrBar = IOcrBAr; xkWord.TwoIFWhile = ifwhiteBan; using (StreamWriter sw = new StreamWriter("D://123.log", true)) { sw.WriteLine("\n"); sw.WriteLine(IOcrBAr); sw.Flush(); } //将所有的块裁剪 识别字符对比字符串 //进行推理 //从第一次拍照全图范围内目标检测然后进行OCR识别 MLRequest CamOneI = new MLRequest(); CamOneI.currentMat = Cv2.ImRead(Cam1OnePath); CamOneI.ResizeWidth = 640; CamOneI.ResizeHeight = 640; CamOneI.Score = 0.3f; CamOneI.in_lable_path = LablePath;//标签路径 CamOneI.confThreshold = 0.3f;//模型置信度 CamOneI.iouThreshold = 0.4f;//检测IOU CamOneI.out_node_name = "output"; MLResult mL3 = simboObjectDetection.RunInferenceFixed(CamOneI); MLResult mLButton = simboObjectDetButton.RunInferenceFixed(CamOneI); //if (mL3.IsSuccess) //{ // DateTime dt = DateTime.Now; // mL3.ResultMap.Save("D:\\Hisence\\detImages\\" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "1result.jpg"); //} List strMatListOne = new List(); List strMatFuzzyListOne = new List(); Mat mResultCut = CamOneI.currentMat.Clone(); Mat mCut = new Mat(); Dictionary keyValueResult = new Dictionary(); InsertSqlRunDataButton(ref keyValueResult, true, ref mCut, ref mResultCut, mL3, mLButton, ref xK_HisenceSQLWord, ref xkWord, ref strMatListOne, ref strMatFuzzyListOne, ref paddleOcrModel); MLRequest CamTwoI = new MLRequest(); CamTwoI.currentMat = Cv2.ImRead(Cam1TwoPath); CamTwoI.ResizeWidth = 640; CamTwoI.ResizeHeight = 640; CamTwoI.Score = 0.3f; CamTwoI.in_lable_path = LablePath;//标签路径 CamTwoI.confThreshold = 0.3f;//模型置信度 CamTwoI.iouThreshold = 0.4f;//检测IOU CamTwoI.out_node_name = "output"; MLResult mL4 = simboObjectDetection.RunInferenceFixed(CamTwoI); //if (mL4.IsSuccess) //{ // DateTime dt = DateTime.Now; // mL4.ResultMap.Save("D:\\Hisence\\detImages\\" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString() + "2result.jpg"); //} List strMatListTwo = new List(); List strMatFuzzyListTwo = new List(); Mat mResultCut2 = CamTwoI.currentMat.Clone(); Dictionary keyValueResult2 = new Dictionary(); InsertSqlRunData(ref keyValueResult2, true, ref mResultCut2, mL4, ref xK_HisenceSQLWord, ref xkWord, ref strMatListTwo, ref strMatFuzzyListTwo, ref paddleOcrModel); InsertXKHisenceWordData(xkWord);//往关键字表中插入一条数据 //文本区域 List bingji = strMatListOne.Union(strMatListTwo).ToList();//并(全)集 List Fuzzybingji = strMatFuzzyListOne.Union(strMatFuzzyListTwo).ToList();//并(全)集 string OcrTextone = bingji.Join("##"); string OcrTextTwo = Fuzzybingji.Join("##"); //string OcrTextinsert = ""; //List bingji = strMatListListOne.Union(strMatListListTwo).ToList();//并(全)集 //for (int j = 0; j < bingji.Count; j++) //{ // string jdetial = bingji[j]; // OcrTextinsert += jdetial + "##"; //} string detstr = ""; //找到识别区域 MLResult MLsum = mL3; for (int v = 0; v < mL4.ResultDetails.Count; v++) { MLsum.ResultDetails.Add(mL4.ResultDetails[v]); } for (int v = 0; v < MLsum.ResultDetails.Count; v++) { if (v < MLsum.ResultDetails.Count - 1) { detstr += MLsum.ResultDetails[v].LabelName + ","; } else { detstr += MLsum.ResultDetails[v].LabelName; } } DateTime dt2 = DateTime.Now; XKHisence xK = new XKHisence("1", IOcrBAr, MoveX, MoveY, MoveZ, detstr, OcrTextone, MoveTwoX, MoveTwoY, MoveTwoZ, ModelChangePath, "", OcrTextTwo); //string log="D:\\Hisence\\detImages\\" + dt2.Year.ToString() + dt2.Month.ToString() + dt2.Day.ToString() + dt2.Hour.ToString() + dt2.Minute.ToString() + dt2.Millisecond.ToString() + "2result.log"; // using (StreamWriter sw=new StreamWriter(log, true)) // { // // sw.WriteLine(xK.OcrBar+"\n"); // sw.WriteLine(xK.OcrText); // sw.WriteLine(xK.FuzzyOcrText); // } //IpaddleOcrModel.FreeModel(); string sql = "insert into XK_Hisence VALUES('" + xK.Type + "','" + xK.OcrBar + "'," + xK.MoveX + "," + xK.MoveY + "," + xK.MoveZ + ",'" + xK.Detect + "','" + xK.OcrText + "'," + xK.MoveTwoX + "," + xK.MoveTwoY + "," + xK.MoveTwoZ + ",'" + xK.OcrParm + "','" + xK.Language + "','" + xK.FuzzyOcrText + "')"; int i = SQLiteHelper.ExecuteSql(sql); if (i == 1) { MessageBox.Show("XK_Hisence插入一条数据"); } //bool ismatch = IsMatchOcrText("WF3S7021BB", strMatListListOne); //相机回调 } public void InsertXKHisenceWordData(XK_HisenceWord xkWord) { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into XK_HisenceWord("); strSql.Append("OcrBar,OneblockPath,OneblockMainWord,OneblockText,TwoRect,TwoIFWhile,TwoblockPath,TwoblockMainWord,TwoblockText,ThreeblockPath," + "ThreeblockMainWord,ThreeblockText,FourblockPath,FourblockMainWord,FourblockText,FiveblockPath,FiveblockMainWord,FiveblockText," + "SixblockPath,SixblockMainWord,SixblockText,SevenblockPath,SevenblockMainWord,SevenblockText,EightblockPath,EightblockMainWord,EightblockText)"); strSql.Append(" values ("); strSql.Append("@OcrBar,@OneblockPath,@OneblockMainWord,@OneblockText,@TwoRect,@TwoIFWhile,@TwoblockPath,@TwoblockMainWord,@TwoblockText,@ThreeblockPath," + "@ThreeblockMainWord,@ThreeblockText,@FourblockPath,@FourblockMainWord,@FourblockText,@FiveblockPath,@FiveblockMainWord,@FiveblockText," + "@SixblockPath,@SixblockMainWord,@SixblockText,@SevenblockPath,@SevenblockMainWord,@SevenblockText,@EightblockPath,@EightblockMainWord,@EightblockText)"); SQLiteParameter[] parameters = { new SQLiteParameter("@OcrBar", DbType.String), new SQLiteParameter("@OneblockPath", DbType.String), new SQLiteParameter("@OneblockMainWord", DbType.String), new SQLiteParameter("@OneblockText", DbType.String), new SQLiteParameter("@TwoRect",DbType.String), new SQLiteParameter("@TwoIFWhile",DbType.String), new SQLiteParameter("@TwoblockPath", DbType.String), new SQLiteParameter("@TwoblockMainWord",DbType.String), new SQLiteParameter("@TwoblockText", DbType.String), new SQLiteParameter("@ThreeblockPath", DbType.String), new SQLiteParameter("@ThreeblockMainWord", DbType.String), new SQLiteParameter("@ThreeblockText", DbType.String), new SQLiteParameter("@FourblockPath", DbType.String), new SQLiteParameter("@FourblockMainWord", DbType.String), new SQLiteParameter("@FourblockText", DbType.String), new SQLiteParameter("@FiveblockPath", DbType.String), new SQLiteParameter("@FiveblockMainWord", DbType.String), new SQLiteParameter("@FiveblockText", DbType.String), new SQLiteParameter("@SixblockPath", DbType.String), new SQLiteParameter("@SixblockMainWord", DbType.String), new SQLiteParameter("@SixblockText", DbType.String), new SQLiteParameter("@SevenblockPath", DbType.String), new SQLiteParameter("@SevenblockMainWord", DbType.String), new SQLiteParameter("@SevenblockText", DbType.String), new SQLiteParameter("@EightblockPath", DbType.String), new SQLiteParameter("@EightblockMainWord", DbType.String), new SQLiteParameter("@EightblockText", DbType.String)}; parameters[0].Value = xkWord.OcrBar; parameters[1].Value = xkWord.OneblockPath; parameters[2].Value = xkWord.OneblockMainWord; parameters[3].Value = xkWord.OneblockText; parameters[4].Value = xkWord.TwoRect; parameters[5].Value = xkWord.TwoIFWhile; parameters[6].Value = xkWord.TwoblockPath; parameters[7].Value = xkWord.TwoblockMainWord; parameters[8].Value = xkWord.TwoblockText; parameters[9].Value = xkWord.ThreeblockPath; parameters[10].Value = xkWord.ThreeblockMainWord; parameters[11].Value = xkWord.ThreeblockText; parameters[12].Value = xkWord.FourblockPath; parameters[13].Value = xkWord.FourblockMainWord; parameters[14].Value = xkWord.FourblockText; parameters[15].Value = xkWord.FiveblockPath; parameters[16].Value = xkWord.FiveblockMainWord; parameters[17].Value = xkWord.FiveblockText; parameters[18].Value = xkWord.SixblockPath; parameters[19].Value = xkWord.SixblockMainWord; parameters[20].Value = xkWord.SixblockText; parameters[21].Value = xkWord.SevenblockPath; parameters[22].Value = xkWord.SevenblockMainWord; parameters[23].Value = xkWord.SevenblockText; parameters[24].Value = xkWord.EightblockPath; parameters[25].Value = xkWord.EightblockMainWord; parameters[26].Value = xkWord.EightblockText; int iv = SQLiteHelper.ExecuteSql(strSql.ToString(), parameters); if (iv == 1) { MessageBox.Show("关键字XK_HisenceWord插入一条数据"); } } public void InsertXK_HisenceWordMatchData(XK_HisenceWord xkWord, bool ifMatch) { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into XK_HisenceWordMatch("); strSql.Append("OcrBar,OneblockPath,OneblockMainWord,OneblockText,TwoRect,TwoIFWhile,TwoblockPath,TwoblockMainWord,TwoblockText,ThreeblockPath," + "ThreeblockMainWord,ThreeblockText,FourblockPath,FourblockMainWord,FourblockText,FiveblockPath,FiveblockMainWord,FiveblockText," + "SixblockPath,SixblockMainWord,SixblockText,SevenblockPath,SevenblockMainWord,SevenblockText,EightblockPath,EightblockMainWord,EightblockText,Datetime,IfMatch)"); strSql.Append(" values ("); strSql.Append("@OcrBar,@OneblockPath,@OneblockMainWord,@OneblockText,@TwoRect,@TwoIFWhile,@TwoblockPath,@TwoblockMainWord,@TwoblockText,@ThreeblockPath," + "@ThreeblockMainWord,@ThreeblockText,@FourblockPath,@FourblockMainWord,@FourblockText,@FiveblockPath,@FiveblockMainWord,@FiveblockText," + "@SixblockPath,@SixblockMainWord,@SixblockText,@SevenblockPath,@SevenblockMainWord,@SevenblockText,@EightblockPath,@EightblockMainWord,@EightblockText,@Datetime,@IfMatch)"); SQLiteParameter[] parameters = { new SQLiteParameter("@OcrBar", DbType.String), new SQLiteParameter("@OneblockPath", DbType.String), new SQLiteParameter("@OneblockMainWord", DbType.String), new SQLiteParameter("@OneblockText", DbType.String), new SQLiteParameter("@TwoRect",DbType.String), new SQLiteParameter("@TwoIFWhile",DbType.String), new SQLiteParameter("@TwoblockPath", DbType.String), new SQLiteParameter("@TwoblockMainWord",DbType.String), new SQLiteParameter("@TwoblockText", DbType.String), new SQLiteParameter("@ThreeblockPath", DbType.String), new SQLiteParameter("@ThreeblockMainWord", DbType.String), new SQLiteParameter("@ThreeblockText", DbType.String), new SQLiteParameter("@FourblockPath", DbType.String), new SQLiteParameter("@FourblockMainWord", DbType.String), new SQLiteParameter("@FourblockText", DbType.String), new SQLiteParameter("@FiveblockPath", DbType.String), new SQLiteParameter("@FiveblockMainWord", DbType.String), new SQLiteParameter("@FiveblockText", DbType.String), new SQLiteParameter("@SixblockPath", DbType.String), new SQLiteParameter("@SixblockMainWord", DbType.String), new SQLiteParameter("@SixblockText", DbType.String), new SQLiteParameter("@SevenblockPath", DbType.String), new SQLiteParameter("@SevenblockMainWord", DbType.String), new SQLiteParameter("@SevenblockText", DbType.String), new SQLiteParameter("@EightblockPath", DbType.String), new SQLiteParameter("@EightblockMainWord", DbType.String), new SQLiteParameter("@EightblockText", DbType.String), new SQLiteParameter("@Datetime", DbType.String), new SQLiteParameter("@IfMatch", DbType.Boolean)}; parameters[0].Value = xkWord.OcrBar; parameters[1].Value = xkWord.OneblockPath; parameters[2].Value = xkWord.OneblockMainWord; parameters[3].Value = xkWord.OneblockText; parameters[4].Value = xkWord.TwoRect; parameters[5].Value = xkWord.TwoIFWhile; parameters[6].Value = xkWord.TwoblockPath; parameters[7].Value = xkWord.TwoblockMainWord; parameters[8].Value = xkWord.TwoblockText; parameters[9].Value = xkWord.ThreeblockPath; parameters[10].Value = xkWord.ThreeblockMainWord; parameters[11].Value = xkWord.ThreeblockText; parameters[12].Value = xkWord.FourblockPath; parameters[13].Value = xkWord.FourblockMainWord; parameters[14].Value = xkWord.FourblockText; parameters[15].Value = xkWord.FiveblockPath; parameters[16].Value = xkWord.FiveblockMainWord; parameters[17].Value = xkWord.FiveblockText; parameters[18].Value = xkWord.SixblockPath; parameters[19].Value = xkWord.SixblockMainWord; parameters[20].Value = xkWord.SixblockText; parameters[21].Value = xkWord.SevenblockPath; parameters[22].Value = xkWord.SevenblockMainWord; parameters[23].Value = xkWord.SevenblockText; parameters[24].Value = xkWord.EightblockPath; parameters[25].Value = xkWord.EightblockMainWord; parameters[26].Value = xkWord.EightblockText; parameters[27].Value = DateTime.Now; parameters[28].Value = ifMatch; int iv = SQLiteHelper.ExecuteSql(strSql.ToString(), parameters); if (iv == 1) { MessageBox.Show("关键字XK_HisenceWordMatch插入一条数据"); } } public void InsertXKHisenceDET(XKHisence xkWord) { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into XKHisenceDet("); strSql.Append("Type,OcrBar,MoveX,MoveY,MoveZ,Detect,OcrText,MoveTwoX,MoveTwoY,MoveTwoZ,Datetime,IfMatch)"); strSql.Append(" values ("); strSql.Append("@Type,@OcrBar,@MoveX,@MoveY,@MoveZ,@Detect,@OcrText,@MoveTwoX,@MoveTwoY,@MoveTwoZ,@Datetime,@IfMatch)"); SQLiteParameter[] parameters = { new SQLiteParameter("@OcrBar", DbType.String), new SQLiteParameter("@MoveX", DbType.String), new SQLiteParameter("@MoveY", DbType.String), new SQLiteParameter("@MoveZ", DbType.String), new SQLiteParameter("@Detect",DbType.String), new SQLiteParameter("@OcrText", DbType.String), new SQLiteParameter("@MoveTwoX",DbType.String), new SQLiteParameter("@MoveTwoY", DbType.String), new SQLiteParameter("@MoveTwoZ", DbType.String), new SQLiteParameter("@Datetime", DbType.String), new SQLiteParameter("@IfMatch", DbType.String)}; parameters[0].Value = xkWord.OcrBar; parameters[1].Value = xkWord.MoveX; parameters[2].Value = xkWord.MoveY; parameters[3].Value = xkWord.MoveZ; parameters[4].Value = xkWord.Detect; parameters[5].Value = xkWord.OcrText; parameters[6].Value = xkWord.MoveTwoX; parameters[7].Value = xkWord.MoveTwoY; parameters[8].Value = xkWord.MoveTwoZ; int iv = SQLiteHelper.ExecuteSql(strSql.ToString(), parameters); if (iv == 1) { MessageBox.Show("关键字XK_HisenceWord插入一条数据"); } } #endregion private void queryALLBtn_Click(object sender, EventArgs e) { try { DataSet dataSet = SQLiteHelper.Query("select * from XK_Hisence"); InsertDataDgv.DataSource = dataSet.Tables[0]; } catch (Exception es) { } } private void QueryoneBtn_Click(object sender, EventArgs e) { try { string type = TypeBox.Text; string OcrBar = OcrBarBox.Text; string moveX = moveXbox.Text; string moveY = moveYbox.Text; string moveZ = moveZbox.Text; string Detect = DetectBArMatbox.Text; string movetwoX = moveTwoXbox.Text; string movetwoY = moveTwoYbox.Text; string movetwoZ = moveTwoZbox.Text; string sql = "select * from XK_Hisence where type='" + type + "' or OcrBar='" + OcrBar + "'"; DataSet dataSet = SQLiteHelper.Query(sql); InsertDataDgv.DataSource = dataSet.Tables[0]; } catch (Exception es) { } } private void OpenDirBtn_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "请打开图片"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string fName = openFileDialog.FileName; //File fileOpen = new File(fName); //isFileHaveName = true; //richTextBox1.Text = fileOpen.ReadFile(); //richTextBox1.AppendText(""); Cam1MatCbx.Text = fName; Cam1OnePath = fName; } } private void OpenTwoDirBtn_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "请打开图片"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string fName = openFileDialog.FileName; //File fileOpen = new File(fName); //isFileHaveName = true; //richTextBox1.Text = fileOpen.ReadFile(); //richTextBox1.AppendText(""); Cam2MatCbx.Text = fName; Cam1TwoPath = fName; } } private void openModelBtn_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "请打开json"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string fName = openFileDialog.FileName; //File fileOpen = new File(fName); //isFileHaveName = true; //richTextBox1.Text = fileOpen.ReadFile(); //richTextBox1.AppendText(""); modelChangeCbx.Text = fName; ModelChangePath = fName; } } private void SnapshotCam2_Click_1(object sender, EventArgs e) { Cam2.Snapshot(); } private async void Defet_OnDetectionDone(Mat detectionImage, int BlockId) { await Task.Run(() => { if (!this.IsHandleCreated) return; this.Invoke(new Action(() => { if (this.IsDisposed) return; switch (BlockId) { case 1: { DefetShow1.ImaMAt = detectionImage; } break; case 2: { DefetShow2.ImaMAt = detectionImage; } break; case 3: { DefetShow3.ImaMAt = detectionImage; } break; case 4: { DefetShow4.ImaMAt = detectionImage; } break; case 5: { DefetShow5.ImaMAt = detectionImage; } break; case 6: { // DefetShow6.ImaMAt = detectionImage; } break; case 7: { // DefetShow7.ImaMAt = detectionImage; } break; case 8: { // DefetShow8.ImaMAt = detectionImage; } break; } //var display = displayList.FirstOrDefault(u => u.DetectionId == detectionId); //if (display != null) //{ // display.RefreshDetectionResult(image, detectionResults); //} })); }); } /// /// 全图洗衣机 裁剪之后 OCR识别的结果 /// /// /// /// 全图图片 /// 全局图片上的目标定位结果(包括定位矩形框) /// /// /// 返回的定位框的结果 /// /// public void InsertSqlRunDataButton(ref Dictionary keyValueResult, bool saveimage, ref Mat CutMat, ref Mat currentMatC, MLResult cam1TwoML, MLResult cam1Button, ref XK_HisenceWord SQlxK_HisenceWord, ref XK_HisenceWord xK_HisenceWord, ref List strMatList, ref List strMatRefList, ref PaddleOcrModel IOcrModel) { #if true //try //{ Mat mResultCut = currentMatC.Clone(); Rect areaBlack = new Rect(); //旋钮的位置 if (cam1Button.ResultDetails.Count == 1) { Mat mResultCuti = mResultCut.Clone(); int rectsx = cam1Button.ResultDetails[0].Rect.X; int rectsy = cam1Button.ResultDetails[0].Rect.Y; int rectsWidth = cam1Button.ResultDetails[0].Rect.Width; int rectsHeight = cam1Button.ResultDetails[0].Rect.Height; areaBlack = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); } for (int i = 0; i < cam1TwoML.ResultDetails.Count; i++) { Mat mResultCuti = mResultCut.Clone(); int rectsx = cam1TwoML.ResultDetails[i].Rect.X; int rectsy = cam1TwoML.ResultDetails[i].Rect.Y; int rectsWidth = cam1TwoML.ResultDetails[i].Rect.Width; int rectsHeight = cam1TwoML.ResultDetails[i].Rect.Height; string blockIndex = cam1TwoML.ResultDetails[i].LabelDisplay; if(keyValueResult.Keys.Contains(blockIndex)) { int indexof = keyValueResult.Keys.ToList().IndexOf(blockIndex); int rectsxof = cam1TwoML.ResultDetails[indexof].Rect.X; if(rectsx> rectsxof) { blockIndex = "3"; } } Rect area2 = new Rect(0, 0, 0, 0); Mat matCut = new Mat(); if (blockIndex == "2")//根据旋钮扩大范围 { //如果旋钮在第三块板则旋钮的位置就是0,0,0,0 if ((areaBlack.X + areaBlack.Width) < (rectsx + rectsWidth)) { areaBlack.X -= rectsx; areaBlack.Y -= rectsy; area2 = areaBlack; } string TwoRectStr = CheckDiffSciHelper.rectChangeStr(area2); xK_HisenceWord.TwoRect = TwoRectStr; } Stopwatch sw = Stopwatch.StartNew(); sw.Start(); int extendHeight = 50; rectsHeight += extendHeight; Rect area = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); matCut = new Mat(mResultCuti, area); //OCR识别裁剪图片 MLRequest reqcut = new MLRequest(); reqcut.currentMat = matCut.Clone(); MLResult mLCut = paddleOcrModel.RunInference(reqcut); bool blockMatchI = BlockChangeFun(saveimage, blockIndex, ref matCut, ref mLCut, ref SQlxK_HisenceWord, ref xK_HisenceWord); sw.Stop(); myLog("插入每块板需要的时间" + sw.ElapsedMilliseconds, DateTime.Now); keyValueResult.Add(blockIndex, blockMatchI); } //} //catch (Exception ex) //{ //} #endif } /// /// 全图洗衣机 裁剪之后 OCR识别的结果 /// /// 全图图片 /// 全局图片上的目标定位结果(包括定位矩形框) /// 返回的定位框的结果 public void InsertSqlRunData(ref Dictionary keyValueResult2, bool saveimage, ref Mat currentMatC, MLResult cam1TwoML, ref XK_HisenceWord SQlxK_HisenceWord, ref XK_HisenceWord xK_HisenceWord, ref List strMatList, ref List strMatRefList, ref PaddleOcrModel IOcrModel) { #if true //try //{ Mat mResultCut = currentMatC.Clone(); for (int i = 0; i < cam1TwoML.ResultDetails.Count; i++) { Mat mResultCuti = mResultCut.Clone(); int rectsx = cam1TwoML.ResultDetails[i].Rect.X; int rectsy = cam1TwoML.ResultDetails[i].Rect.Y; int rectsWidth = cam1TwoML.ResultDetails[i].Rect.Width; int rectsHeight = cam1TwoML.ResultDetails[i].Rect.Height; string blockIndex = cam1TwoML.ResultDetails[i].LabelDisplay; Rect area = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); Mat matCut = new Mat(mResultCuti, area); Stopwatch sw = new Stopwatch(); sw.Start(); //OCR识别裁剪图片 MLRequest reqcut = new MLRequest(); reqcut.currentMat = matCut.Clone(); MLResult mLCut = paddleOcrModel.RunInference(reqcut); bool blockMatchI = BlockChangeFun(saveimage, blockIndex, ref matCut, ref mLCut, ref SQlxK_HisenceWord, ref xK_HisenceWord); keyValueResult2.Add(blockIndex, blockMatchI); sw.Stop(); myLog("插入每块板需要的时间" + sw.ElapsedMilliseconds, DateTime.Now); } //} //catch (Exception ex) //{ //} #endif } /// /// 这块板和数据库比对是否正确 /// /// 是否保存 /// 裁剪的一块索引 /// 裁剪的一张图片 /// 裁剪图片的一些信息 /// 要存储入数据库的东西 public bool BlockChangeFun(bool saveimage, string blockIndex, ref Mat CutBlockMat, ref MLResult mLcut, ref XK_HisenceWord SQlxK_HisenceWord, ref XK_HisenceWord xK_HisenceWord) { bool OneIF = false; string CutSavePath = ""; //在第一次插入时候存入面板2 图片和目录 if (saveimage) { string OcrBar = xK_HisenceWord.OcrBar; string namecutSavepath = OcrBar + "\\" + blockIndex + "\\" + OcrBar + "result.jpg"; CutSavePath = Path.Combine(RootPath, namecutSavepath); //得到目录 if (!Directory.Exists(Path.GetDirectoryName(CutSavePath))) { Directory.CreateDirectory(Path.GetDirectoryName(CutSavePath)); } Cv2.ImWrite(CutSavePath, CutBlockMat); } //存放关键字和所有字符串 List OcrTextinsert = new List();//存放关键字 List OcrFuzzyTextInsert = new List();//存放模糊字 //这一块图片上的关键字比对 如果有问题就显示出来并且标注 //MatMessage(saveimage, ocrBar, blockIndex, ref CutBlockMat, ref mLcut, ref OcrTextinsert, ref OcrFuzzyTextInsert, ref CutSavePath); //在这里面找到带数字的关键字 将所有字也存放在数据库中 for (int j = 0; j < mLcut.ResultDetails.Count; j++) { var resultDetail = mLcut.ResultDetails[j]; if (resultDetail.Score > 0.8) { string jdetial = mLcut.ResultDetails[j].LabelDisplay; string result = Regex.Replace(jdetial, "[ \\[ \\] \\^ \\-_*×――(^)$%~!@#$…&%¥—+=<>《》!!???::?`·、。,;,.;/\"‘’“”-]", ""); if (Regex.IsMatch(result, @"\d")) { OcrTextinsert.Add(result); } OcrFuzzyTextInsert.Add(result); } } DateTime dt = DateTime.Now; string MainWoidStr = OcrTextinsert.Join("##"); //实际的关键字 string TextWoidStr = OcrFuzzyTextInsert.Join("##"); //实际的检测字 string SQLStr = "";//日志显示数据库的关键字 bool juanjiMatch = false; switch (blockIndex) { case "1"://完全匹配 重量信息 { xK_HisenceWord.OneblockPath = CutSavePath; xK_HisenceWord.OneblockMainWord = MainWoidStr; xK_HisenceWord.OneblockText = TextWoidStr; SQLStr = SQlxK_HisenceWord.OneblockMainWord; if (!saveimage) { OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.OneblockMainWord, SQLStr); if (!OneIF) { //显示错误的板 DisplayResult(mLcut); Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 1); } else { Defet_OnDetectionDone(OKMat, 1); } } } break; case "2"://控制面板 匹配 { xK_HisenceWord.TwoblockPath = CutSavePath; xK_HisenceWord.TwoblockMainWord = MainWoidStr; xK_HisenceWord.TwoblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.TwoblockMainWord; bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.TwoblockMainWord, SQlxK_HisenceWord.TwoblockMainWord); OneIF1 = true; //第二快 卷积匹配 string PathSql = SQlxK_HisenceWord.TwoblockPath; // Rect rectsql = CheckDiffSciHelper.strChangeRect(SQlxK_HisenceWord.TwoRect); Rect rectDet = CheckDiffSciHelper.strChangeRect(xK_HisenceWord.TwoRect); juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rectsql, rectDet, (bool)SQlxK_HisenceWord.TwoIFWhile, "D://Hisence//Test"); // juanjiMatch = true; if (!OneIF1 || !juanjiMatch) { OneIF = false; DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 2); } else { OneIF = true; Defet_OnDetectionDone(OKMat, 2); } } } break; case "3"://第三块板匹配 { xK_HisenceWord.ThreeblockPath = CutSavePath; xK_HisenceWord.ThreeblockMainWord = MainWoidStr; xK_HisenceWord.ThreeblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.ThreeblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.ThreeblockMainWord, SQlxK_HisenceWord.ThreeblockMainWord); if (!OneIF) { DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 3); } else { Defet_OnDetectionDone(OKMat, 3); } } } break; case "4"://贴纸匹配 { xK_HisenceWord.FourblockPath = CutSavePath; xK_HisenceWord.FourblockMainWord = MainWoidStr; xK_HisenceWord.FourblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.FourblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.FourblockMainWord, SQlxK_HisenceWord.FourblockMainWord); if (!OneIF) { DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 4); } else { Defet_OnDetectionDone(OKMat, 4); } } } break; case "5"://贴纸匹配 { xK_HisenceWord.FiveblockPath = CutSavePath; xK_HisenceWord.FiveblockMainWord = MainWoidStr; xK_HisenceWord.FiveblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.FiveblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.FiveblockMainWord, SQlxK_HisenceWord.FiveblockMainWord); if (!OneIF) { DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 5); } else { Defet_OnDetectionDone(OKMat, 5); } } } break; case "6"://贴纸匹配 { xK_HisenceWord.SixblockPath = CutSavePath; xK_HisenceWord.SixblockMainWord = MainWoidStr; xK_HisenceWord.SixblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.SixblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.SixblockMainWord, SQlxK_HisenceWord.SixblockMainWord); if (!OneIF) { // DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 6); } else { Defet_OnDetectionDone(OKMat, 6); } } } break; case "7"://贴纸匹配 { xK_HisenceWord.SevenblockPath = CutSavePath; xK_HisenceWord.SevenblockMainWord = MainWoidStr; xK_HisenceWord.SevenblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.SevenblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.SevenblockMainWord, SQlxK_HisenceWord.SevenblockMainWord); if (!OneIF) { //DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 7); } else { Defet_OnDetectionDone(OKMat, 7); } } } break; case "8"://贴纸匹配 { xK_HisenceWord.EightblockPath = CutSavePath; xK_HisenceWord.EightblockMainWord = MainWoidStr; xK_HisenceWord.EightblockText = TextWoidStr; if (!saveimage) { SQLStr = SQlxK_HisenceWord.EightblockMainWord; OneIF = ManagerModelHelper.StrMatch2(xK_HisenceWord.EightblockMainWord, SQlxK_HisenceWord.EightblockMainWord); if (!OneIF) { // DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 8); } else { Defet_OnDetectionDone(OKMat, 8); } } } break; } using (StreamWriter sw = new StreamWriter("D://Hisence//logsMatch.log", true)) { string filename = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString(); sw.WriteLine(filename + "\n"); if (blockIndex == "2") { sw.WriteLine("卷积匹配" + juanjiMatch); } sw.WriteLine("块" + blockIndex + "数据库" + SQLStr + "关键字" + MainWoidStr + "结果" + OneIF + "\n"); sw.WriteLine("块" + blockIndex + " 所有字 " + TextWoidStr + "\n"); sw.Flush(); } return OneIF; } private void bnGetParam2_Click_1(object sender, EventArgs e) { // tbExposure2.Text = Cam2.dvpGetExposure().ToString(); //tbGain2.Text = Cam2.dvpGetAnalogGain().ToString(); } private void panel2_Paint(object sender, PaintEventArgs e) { } private void bnSetParam_Click(object sender, EventArgs e) { } private void groupBox2_Enter(object sender, EventArgs e) { } private void XZerorbx_Click(object sender, EventArgs e) { if (!ifXZeroValue) { this.XZerorbx.Checked = true; //归零 melsecPLCTCPDriver.WriteInt("503", 1); ifXZeroValue = true; this.txtSetValue.Text = "1"; myLog("X轴开始归零", DateTime.Now); } else { this.XZerorbx.Checked = false; melsecPLCTCPDriver.WriteInt("503", 0); ifXZeroValue = false; this.txtSetValue.Text = "0"; myLog("X轴停止归零", DateTime.Now); } } } }