using DVPCameraType; using Microsoft.VisualBasic.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSharp.Extensions; using OpenCvSharp.XFeatures2D; using STTech.CodePlus.Threading; using Sunny.UI; using Sunny.UI.Win32; 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.Threading; using System.Windows.Forms; using System.Xml.Serialization; using XKRS.Device.SimboVision.SimboHelper; using XKRS.UI; using static HisenceYoloDetection.CheckDiffSciHelper; 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 { enum MeachineState { machine_opening, machine_closing, } public MainForm() { InitializeComponent(); this.Load += (s, e) => { // OnDetectionDone -= Defet_OnDetectionDone; //OnDetectionDone += Defet_OnDetectionDone; }; } MeachineState meachineState = MeachineState.machine_closing; 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); AutoResetEvent _runHandleBefore = new AutoResetEvent(false); ManualResetEvent _runHandleAfter = new ManualResetEvent(false); AutoResetEvent _runThreadFormtype = new AutoResetEvent(false); bool PLC545 = false; bool PLC548 = false; string m_sKEYENCEBar; string Oldm_sKEYENCEBar; string OcrBar = "";//洗衣机编号 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;//数据库中的洗衣机数据 XKHisence Old_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 = ""; //报警灯 string GreenLightingAdress = "556"; string YellowLightingAdress = "554"; string RedLightingAdress = "552"; string WaringAdress = "558"; /// /// 查看相机列表 /// 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(); } } /// /// GET方式发送得结果 /// /// 请求的url /// 服务器响应的数据 public static string getHttpRequest(string url) { //预备请求的资源 HttpWebRequest request = null; HttpWebResponse response = null; StreamReader reader = null; string content = string.Empty; try { request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; response = (HttpWebResponse)request.GetResponse(); using (reader = new StreamReader(response.GetResponseStream())) { content = reader.ReadToEnd(); } } catch (System.Exception err) { MessageBox.Show("1.GET出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message + "\n" + err); Console.WriteLine("1.GET出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message); } //用完销毁 response.Dispose(); reader.Dispose(); return content; } /// /// 发起一个http请求,方式为POST /// /// 发送请求的目标url /// 要发送的消息 /// 服务器响应的数据 public string postHttpRequest(string uri, string msg) { //预备请求的资源 HttpWebRequest request = null; HttpWebResponse response = null; Stream requestStream = null; StreamReader reader = null; var data = Encoding.UTF8.GetBytes(string.Format("a={0}&b={1}", "message", msg)); string content = ""; try { request = (HttpWebRequest)WebRequest.Create(uri); request.Method = "POST"; requestStream = request.GetRequestStream(); request.ContentType = "application/text"; requestStream.Write(data, 0, data.Length); response = (HttpWebResponse)request.GetResponse(); using (reader = new StreamReader(response.GetResponseStream())) { content = reader.ReadToEnd(); } } catch (Exception err) { MessageBox.Show("1.POST出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message + "\n" + err); Console.WriteLine("1.POST出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message); } //资源用完回收 requestStream.Dispose(); response.Dispose(); reader.Dispose(); return content; } public static string PostData(string url, string postData) { byte[] data = Encoding.UTF8.GetBytes(postData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (StreamReader reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } static string FindStringAfterColon(string response, string targetString) { int targetIndex = response.IndexOf(targetString); if (targetIndex == -1) { Console.WriteLine($"未找到字符串: {targetString}"); return null; } // 查找目标字符串后的冒号和引号 int colonIndex = response.IndexOf(':', targetIndex); if (colonIndex == -1 || colonIndex <= targetIndex) { Console.WriteLine("在目标字符串后未找到冒号"); return null; } // 查找引号开始的位置 int startQuoteIndex = response.IndexOf('"', colonIndex + 1); if (startQuoteIndex == -1) { Console.WriteLine("未找到引号"); return null; } // 查找闭合引号的位置 int endQuoteIndex = response.IndexOf('"', startQuoteIndex + 1); if (endQuoteIndex == -1) { Console.WriteLine("未找到闭合的引号"); return null; } // 提取并返回引号内的字符串 return response.Substring(startQuoteIndex + 1, endQuoteIndex - startQuoteIndex - 1); } #region Post请求 /// /// http Post请求 /// /// 参数 /// 访问地址 /// 默认 application/json , application/x-www-form-urlencoded,multipart/form-data,raw,binary /// 默认application/json /// public string Post(string parameterData, string serviceUrl, string contentType = "application/x-www-form-urlencoded", string accept = "application/json") { try { // 创建 Web 请求对象 HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl); byte[] buf = Encoding.UTF8.GetBytes($"inputvalue={Uri.EscapeDataString(parameterData)}"); myRequest.Method = "POST"; myRequest.Accept = accept; myRequest.ContentType = contentType; myRequest.ContentLength = buf.Length; // 发送请求 using (Stream stream = myRequest.GetRequestStream()) { stream.Write(buf, 0, buf.Length); } // 获取响应内容 using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse()) using (StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } catch (WebException ex) { if (ex.Response != null) { using (StreamReader reader = new StreamReader(ex.Response.GetResponseStream())) { string errorResponse = reader.ReadToEnd(); Console.WriteLine("WebException: " + errorResponse); return errorResponse; } } else { Console.WriteLine("WebException: " + ex.Message); return null; } } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); return null; } } #endregion Dictionary DayTypeDics = new Dictionary();//存放当日的SN和型号值 public void GetTypeFromPost() { string url = "http://172.16.139.146/FCCBOMWebService/FCCBomService.asmx/GetFCCBomInfoPDJson"; string jsonData = @" { ""StartTime"": ""2024-07-1"", ""EndTime"": ""2024-07-22"", ""LineBody"": ""BZ-PC"" }"; string postData = "inputvalue=" + Uri.EscapeDataString(jsonData); try { string response = PostData(url, postData); string productType = null; // 解析并处理响应 string finalDefIdToFind = m_sKEYENCEBar.Substring(0, m_sKEYENCEBar.Length - 7); // 目标 FinalDefID productType = FindStringAfterColon(response, finalDefIdToFind); if (productType == null) { finalDefIdToFind = finalDefIdToFind.Substring(0, finalDefIdToFind.Length - 6); productType = FindStringAfterColon(response, finalDefIdToFind); } } catch (Exception ex) { Console.WriteLine("Error occurred:"); Console.WriteLine(ex.Message); } } /// /// 主窗口 /// /// /// private void MainForm_Load(object sender, EventArgs e) { //string path22 = "D:\\Hisence\\test2\\222.jpg"; //Mat pathmat2 = Cv2.ImRead(path22); //Mat pathmat2result = Cv2.ImRead(path22); //string path222 = "D:\\Hisence\\test2\\111.jpg"; //Rect rect1 = new Rect(0, 0, 0, 0); //CheckDiffSciHelper.CheckDiffSci(path222, pathmat2,ref pathmat2result, rect1, rect1, true, "D://Hisence//test2"); Stopwatch sw = new Stopwatch(); sw.Start(); // string url = "http://172.16.139.146/FCCBOMWebService/FCCBomService.asmx/GetFCCBomInfoPDJson"; // string jsonData = @" //{ // ""StartTime"": ""2024-07-15"", // ""EndTime"": ""2024-07-15"", // ""LineBody"": ""BZ-PC"" // }"; // string postData = "inputvalue=" + Uri.EscapeDataString(jsonData); // try // { // string response = PostData(url, postData); // // 解析并处理响应 // string finalDefIdToFind = m_sKEYENCEBar.Substring(0, m_sKEYENCEBar.Length - 7); // string productType = FindStringAfterColon(response, finalDefIdToFind); // if (productType != null) // { // Console.WriteLine($"{finalDefIdToFind}: {productType}"); // // 将结果写入文件 // } // else // { // Console.WriteLine($"FinalDefID {finalDefIdToFind} not found in response."); // } // } // catch (Exception ex) // { // Console.WriteLine("Error occurred:"); // Console.WriteLine(ex.Message); // } sw.Stop(); Console.WriteLine("时间请求i:" + sw.ElapsedMilliseconds); if (_runHandleBefore == null) { _runHandleBefore = new AutoResetEvent(false); } if (_runHandleAfter == null) { _runHandleAfter = new ManualResetEvent(false); } string s1 = "gorenjeSTEAMTECHSNOWFLAKEDRUM65kg"; string s2 = "STEAMTECHSNOWFLAKEDRUM65kg"; bool st = ManagerModelHelper.StrMatch(s1, s2); bool st1 = 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);//绑定委托 Scanner.Strart(); Scanner.OnClientDataReceived -= OnDataReceived; Scanner.OnClientDataReceived += OnDataReceived; Scanner.btnSendMsg("LON\r");//发送开启指令 myLog("发送恩士扫码枪开启指令", DateTime.Now); //初始化PLC melsecPLCTCPDriver.Start(); melsecPLCTCPDriver.Heartbeat -= PLcHeratAdress; melsecPLCTCPDriver.Heartbeat += PLcHeratAdress; OnSpeedShow();//线程开启将速度显示在界面上 OnPostionShow();//线程开启将位置显示在界面上 melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 1);//黄灯 melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0);//绿灯 melsecPLCTCPDriver.WriteInt(WaringAdress, 0);//不报警 //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(); textBox1.Text = WUsums.ToString(); textBox4.Text = WAIsums.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"); Mat whiteMat = Cv2.ImRead("white.jpg"); /// /// 主线程调用 /// /// /// private void InitMachine_Click(object sender, EventArgs e) { try { //初始化相机 meachineState = MeachineState.machine_opening;//状态机设置成OPen 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; //初始化扫码枪 //PLC使能开启 melsecPLCTCPDriver.WriteInt("581", 0);//定位松开 melsecPLCTCPDriver.WriteInt("504", 0);//定位松开 melsecPLCTCPDriver.WriteInt("514", 0);//定位松开 melsecPLCTCPDriver.WriteInt("524", 0);//定位松开 melsecPLCTCPDriver.WriteInt("406", 60000); //写入手动速度 melsecPLCTCPDriver.WriteInt("416", 10000); melsecPLCTCPDriver.WriteInt("426", 10000); melsecPLCTCPDriver.WriteInt("404", 100000); //写入定位速度 melsecPLCTCPDriver.WriteInt("414", 10000); 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); melsecPLCTCPDriver.WriteInt("550", 0); 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) { } // } //}); } #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 = 14957; int ZPos = 1695; bool StopM = false;//第一次用信号挡 /// /// 监听洗衣机544是否触发后面对射传感器 相机 /// public void TriggerCameral2() { //开启一个线程监听PLC得值 Task.Run(() => { try { int iNum1 = 0; int iNum0 = 0; int iNum3 = 0; Thread.CurrentThread.Priority = ThreadPriority.Highest; while (meachineState == MeachineState.machine_opening) { // myResetEvent.Set(); PLC548 = true; int m_iCureent548 = melsecPLCTCPDriver.ReadInt("548"); if (m_iCureent548 != 0) { iNum0++; } else { iNum0 = 0; } if (iNum0 >= 1) { while (meachineState == MeachineState.machine_opening) { bTriger = false; //读到544一直是1持续两s 拍照 m_iCureent548 = melsecPLCTCPDriver.ReadInt("548"); if (m_iCureent548 == 0) { iNum1++; } else { iNum1 = 0; iNum3++;//获取光电没达到洗衣机上的次数 } if (iNum1 >= 2) { //myLog("时间间隔" + iNum3, DateTime.Now); if (!StopM) { melsecPLCTCPDriver.WriteInt("550", 1);//阻塞 StopM = true; } if (bBar) { _runHandleBefore.WaitOne(); //这里改成和海信的对接需求 string OcrBar = ""; string FinalDefIDToFind = m_sKEYENCEBar;// 目标 FinalDefID OcrBar = FormBarType(FinalDefIDToFind); this.Invoke(new Action(() => { ScannerBox.Text = FinalDefIDToFind; textBox3.Text = OcrBar; })); //myLog("扫码器结果" + m_sKEYENCEBar, DateTime.Now); //#if false //是否给Pos请求加上时间超时 //#else // OcrBar = "OZ.洗衣机.WF3G7014-NVW001CZA.WSG374A.白"; //#endif // if(Oldm_sKEYENCEBar!= m_sKEYENCEBar) if (OcrBar.IsNullOrEmpty()) { myLog("Mes系统近日无型号" + m_sKEYENCEBar, DateTime.Now); //break; } xKNow = GetModeFromBar(OcrBar);//从数据库中查询到这个条码的四轴的值 //if (Regex.IsMatch(xKNow.MoveX.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveY.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveZ.ToString(), @"^[0-9]+$")) //{ // // myLog("型号匹配成功" + xKNow.OcrBar, DateTime.Now); //} } // Thread.Sleep(2); bBar = false; #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 > -4000 && dismove < 4000) { MoveToP(5815, YPos, ZPos + (int)(dismove)); } Cam1.SnapshotCount = 0; Cam1.Snapshot(); //Cam2.SnapshotCount = 0; //Cam2.Snapshot(); //myLog("第二次采集图像", DateTime.Now); //if (xKNow != null) //{ // MoveToP(xKNow.MoveTwoX, xKNow.MoveTwoY, xKNow.MoveTwoZ); //} // MoveToP(51043, YPos, ZPos + (int)(dismove)); //Cam1.Snapshot(); MoveToP(5815, YPos, ZPos); melsecPLCTCPDriver.WriteInt("550", 0);//方行 Thread.Sleep(1000);//洗衣机可能过不去 //if (xKNow != null) //{ // MoveToP(xKNow.MoveX, xKNow.MoveY, xKNow.MoveZ); //} myLog("采集图像成功", DateTime.Now); //模组复位 bTriger = true;//可以进行检测识别了 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 } if (iNum3 >= 10) { melsecPLCTCPDriver.WriteInt("550", 1);//阻塞 } } } 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\\001.jpg"); ; Cam1ImgOne = cameraMat; IfCam1OneTriger = true; originMatShow.Image = cameraMat.ToBitmap(); //pictureBox1.Image = cameraMat.ToBitmap(); _runHandleAfter.Set(); _runThreadFormtype.Set(); } //第二次拍照 if (SnapshotCount == 2) { Cam1ImgTwo = Cv2.ImRead("D:\\Hisence\\类型\\1\\002.jpg"); //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(); //_runHandleAfter.Set(); // 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 volatile int WUsums = 0; public volatile int WAIsums = 0; /// /// 开始识别 /// /// public void ReadyDetect() { _ = Task.Run((Action)(() => { Thread.CurrentThread.Priority = ThreadPriority.Highest; while (true) { try { //信号量阻塞 使其不在总数增加和闪烁 _runHandleAfter.WaitOne(); //melsecPLCTCPDriver.WriteInt("550", 0);//方行 //2第一次拍照 //if (IfCam2Triger) //{ //根据条码数据库比对 _runHandleAfter.Reset(); //if (xKNow == null) //{ // myLog("未匹配条码", DateTime.Now); // break; //} //if (xKNow.OcrBar == null) //{ // myLog("未匹配成功" + xKNow.OcrBar, DateTime.Now); // myLog("开始插入模板", DateTime.Now); // Insert_auto(true, Cam1ImgOne, m_sKEYENCEBar, 8974, 0, 0); // break; //} if (m_sKEYENCEBar != null) { if (xKNow == null) { myLog("数据库没有条码匹配" + m_sKEYENCEBar, DateTime.Now); myLog("开始插入模板", DateTime.Now); Insert_auto(true, Cam1ImgOne, m_sKEYENCEBar, 8974, 0, 0); Thread.Sleep(2000); OcrBar = FormBarType(m_sKEYENCEBar); xKNow = GetModeFromBar(OcrBar); // 重新获取 if (xKNow != null) { myLog("插入模板成功!", DateTime.Now); } } } bool MatchStr=false; if (xKNow != null) { string IOcrBAr = xKNow.OcrBar; //xKNow = GetModeFromBar(IOcrBAr);//从数据库中查询到这个条码的四轴的值 //这里改成和海信的对接需求 IfCam1TwoTriger = false; List xkWordList = ManagerModelHelper.GetModeWordFromBar(IOcrBAr); if (xkWordList.Count() == 1) { xK_HisenceSQLWord = xkWordList[0]; } if (xKNow.Detect != "") { myLog("型号匹配成功" + IOcrBAr, DateTime.Now); } //从数据库中匹配完才可以进行模组移动 //如果这次型号和上次的型号一样 就不用换识别模型ll //} //相机1第二次拍照 // if (IfCam1TwoTriger && bBarTriger) //{ //初始化板 Defet_OnDetectionDone(whiteMat, 1); Defet_OnDetectionDone(whiteMat, 2); Defet_OnDetectionDone(whiteMat, 3); //Defet_OnDetectionDone(whiteMat, 4); //Defet_OnDetectionDone(whiteMat, 5); //Defet_OnDetectionDone(whiteMat, 6); //Defet_OnDetectionDone(whiteMat, 7); 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(); 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; } List strMatListTwo = new List(); List strMatFuzzyListTwo = new List(); // Mat mResultCut2 = req2.currentMat.Clone(); Dictionary keyValueResult = new Dictionary(); Dictionary keyValueResult2 = new Dictionary(); #region 先执行定位比对 //执行定位数组块 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[] RealCFLabels = new string[MLsum.ResultDetails.Count]; for (int i = 0; i < MLsum.ResultDetails.Count; i++) { RealCFLabels[i] = MLsum.ResultDetails[i].LabelName; } RealCFLabels = RealCFLabels.Distinct().ToArray();//去重 string detstr = string.Join(",", RealCFLabels); //输出为abc-def-ghi 如果不加-,也可以省 //排序比对块 MatchStr = listLabels.SequenceEqual(RealCFLabels); if (MatchStr == false) { WAIsums++; } #endregion //块比对完了 进行详细比对 if (MatchStr) { //Mat mCut = new Mat(); Stopwatch sw = new Stopwatch(); sw.Start(); InsertSqlRunDataButton(ref keyValueResult, false, ref mResultCut, mL, mLButton, ref xK_HisenceSQLWord, ref xK_MatchDet, ref strMatListOne, ref strMatFuzzyListOne, ref paddleOcrModel); // InsertSqlRunData(ref keyValueResult2, false, ref mResultCut2, mL2, ref xK_HisenceSQLWord, ref xK_MatchDet, ref strMatListTwo, ref strMatFuzzyListTwo, ref paddleOcrModel); sw.Stop(); //myLog("插入面板时间" + sw.ElapsedMilliseconds, DateTime.Now); } if (MatchStr) { //判断块值是否有含有匹配false bool containsFalseValue = keyValueResult.ContainsValue(false); if (containsFalseValue) MatchStr = false; } } else { MatchStr = true; } ///执行比对 小图 //bool MatchStr = ManagerModelHelper.IsMatchSQLText(ref mCut, ref xK_HisenceSQLWord, ref xK_MatchDet); melsecPLCTCPDriver.WriteInt("550", 0);//方行 if (MatchStr) { OKDsums++; myLog("匹配成功", DateTime.Now); //界面显示 // InsertXK_HisenceWordMatchData(xK_MatchDet, true); this.Invoke(new Action(() => { OKOrNGShow.Image = OKbitmap; })); } else { melsecPLCTCPDriver.WriteInt(RedLightingAdress, 1);//红灯 melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0);//黄灯 melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0);//绿灯 melsecPLCTCPDriver.WriteInt(WaringAdress, 1);//报警 //加上人为判断是否是NG洗衣机 DialogResult dr = MessageBox.Show("是否误检?", "是否误检", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dr == DialogResult.OK) { melsecPLCTCPDriver.WriteInt(RedLightingAdress, 0);//红灯 melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 1);//绿灯 melsecPLCTCPDriver.WriteInt(WaringAdress, 0);//报警 OKDsums++; WUsums++; this.Invoke(new Action(() => { double percent = (double)WUsums / AllDsums; string percentText = percent.ToString("0.0%");//最后percentText的值为10.0% textBox1.Text = percentText; OKOrNGShow.Image = OKbitmap; })); myLog("匹配失败", DateTime.Now); } else { NGDsums++; melsecPLCTCPDriver.WriteInt(WaringAdress, 0);//报警 melsecPLCTCPDriver.WriteInt(RedLightingAdress, 0);//红灯 melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 1);//绿灯 this.Invoke(new Action(() => { OKOrNGShow.Image = NGbitmap; })); myLog("匹配成功", DateTime.Now); } } //} } finally { } Thread.Sleep(10); } })); } /// /// 发请求获取当日生产的型号 /// public void ThreadPost() { Task.Run(() => { while (true) { _runThreadFormtype.WaitOne(); GetTypeFromPost(); } }); } /// /// 根据条码从数据库中获取型号 /// /// /// 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 null; } /// /// 接受条码的回调函数 /// /// public void OnDataReceived(byte[] data) { // if (data.Length > 10) { m_sKEYENCEBar = string.Empty; m_sKEYENCEBar = System.Text.Encoding.UTF8.GetString(data); // myLog("型号Ocr" + m_sKEYENCEBar, DateTime.Now); _runHandleBefore.Set(); 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) { //string path22 = "D:\\Hisence\\test2\\002.jpg"; //Mat pathmat2 = Cv2.ImRead(path22); //string path222 = "D:\\Hisence\\test2\\001.jpg"; //Rect rect1 = new Rect(1929, 745, 396, 377); //CheckDiffSciHelper.CheckDiffSci(path222, pathmat2, rect1, rect1, true, "D://Hisence//Test2"); //string path = "D:\\Hisence\\Test1\\1.png"; //Mat pathmat =Cv2.ImRead(path); //string path2 = "D:\\Hisence\\Test1\\2.png"; //Rect rect2 = new Rect(0, 0, 0, 0); //CheckDiffSciHelper1.CheckDiffSci(path2, pathmat, rect2, rect2, false, "D://Hisence//test2"); // OnGetBar(); melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 1);//绿灯 melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0);//黄灯 meachineState = MeachineState.machine_opening; TriggerCameral2();//光电触发拍照 根据SN获取型号 从数据库中得到块值 ReadyDetect();//相机拍照后检测线程 //ThreadPost();//相机拍照后获取当日的型号 myLog("开启流程成功", DateTime.Now); } 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 SNText = OcrBarBox.Text; 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 (SNText != "" && 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, SNText, HmoveX, HmoveY, HmoveZ); } else { MessageBox.Show("插入的数据不能为NULL"); } } catch (Exception es) { MessageBox.Show(es.Message); } } public string FormBarType(string SN) { string productType = "null"; string url = "http://172.16.139.146/FCCBOMWebService/FCCBomService.asmx/GetFCCBomInfoPDJson"; string jsonData = @" { ""StartTime"": ""2024-07-1"", ""EndTime"": ""2024-07-20"", ""LineBody"": ""BZ-PC"" }"; // 获取当天日期 string currentDate = DateTime.Now.ToString("yyyy-MM-dd"); // 解析JSON字符串为JObject JObject jsonObject = JObject.Parse(jsonData); // 更新EndTime字段 jsonObject["EndTime"] = currentDate; // 将JObject转回JSON字符串 string updatedJsonData = jsonObject.ToString(); string postData = "inputvalue=" + Uri.EscapeDataString(updatedJsonData); try { string response = PostData(url, postData); // 解析并处理响应 string finalDefIdToFind = m_sKEYENCEBar.Substring(0, m_sKEYENCEBar.Length - 7); // 目标 FinalDefID productType = FindStringAfterColon(response, finalDefIdToFind); if (productType == null) { finalDefIdToFind = finalDefIdToFind.Substring(0, finalDefIdToFind.Length - 6); productType = FindStringAfterColon(response, finalDefIdToFind); } } catch (Exception ex) { Console.WriteLine("Error occurred:"); Console.WriteLine(ex.Message); } return productType; // sw.Stop(); // Console.WriteLine("时间请求i:" + sw.ElapsedMilliseconds); } public void Insert_auto(bool ifwhiteBan, Mat img, string SNtext, int MoveX, int MoveY, int MoveZ) { string IOcrBAr = FormBarType(SNtext); 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 = img; 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 mResultCut, mL3, mLButton, ref xK_HisenceSQLWord, ref xkWord, ref strMatListOne, ref strMatFuzzyListOne, ref paddleOcrModel); //if (xkWord.OneblockText.) //{ } InsertXKHisenceWordData(xkWord);//往关键字表中插入一条数据 string OcrTextone = strMatListOne.Join("##"); string OcrTextTwo = strMatFuzzyListOne.Join("##"); string detstr = ""; if (keyValueResult.Count<=1) { return; } for (int v = 0; v < keyValueResult.Count; v++) { var item = keyValueResult.ElementAt(v); if (v < keyValueResult.Count - 1) { detstr += item.Key + ","; } else { detstr += item.Key; } } DateTime dt2 = DateTime.Now; XKHisence xK = new XKHisence("1", IOcrBAr, MoveX, MoveY, MoveZ, detstr, OcrTextone, MoveX, MoveY, MoveZ, ModelChangePath, "", OcrTextTwo); 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) { myLog("插入成功", DateTime.Now); //MessageBox.Show("XK_Hisence插入一条数据"); } //bool ismatch = IsMatchOcrText("WF3S7021BB", strMatListListOne); //相机回调 } public void InsertXK_Hisence(bool ifwhiteBan, string SNtext, int MoveX, int MoveY, int MoveZ) { // PaddleOcrModel IpaddleOcrModel = new PaddleOcrModel(); // IpaddleOcrModel.Load(ModelChangePath, "CPU"); string IOcrBAr = FormBarType(SNtext); 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 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 = strMatListOne.Join("##"); string OcrTextTwo = strMatFuzzyListOne.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 = ""; for (int v = 0; v < keyValueResult.Count; v++) { var item = keyValueResult.ElementAt(v); if (v < keyValueResult.Count - 1) { detstr += item.Key + ","; } else { detstr += item.Key; } } DateTime dt2 = DateTime.Now; XKHisence xK = new XKHisence("1", IOcrBAr, MoveX, MoveY, MoveZ, detstr, OcrTextone, MoveX, MoveY, MoveZ, 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 { } 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: { canvas1.ImaMAt = detectionImage; } break; case 2: { canvas2.ImaMAt = detectionImage; } break; case 3: { canvas3.ImaMAt = detectionImage; } break; //case 4: // { // canvas4.ImaMAt = detectionImage; // } // break; //case 5: // { // canvas5.ImaMAt = detectionImage; // } // break; case 6: { //canvas6.ImaMAt = detectionImage; } break; case 7: { // canvas7.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 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 //{ // 初始化日志记录 string filename = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString(); string txtLog = "D://Hisence//" + filename + "logsMatch.log"; using (StreamWriter sw = new StreamWriter(txtLog, true)) { sw.WriteLine(filename + "\n"); sw.Flush(); } // 克隆当前图像 Mat mResultCut = currentMatC.Clone(); Rect areaBlack = new Rect(); // 旋钮的位置 if (cam1Button.ResultDetails.Count == 1) { 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; // 修正旋钮位置,防止负数 rectsx = Math.Max(rectsx, 0); rectsy = Math.Max(rectsy, 0); rectsWidth = Math.Min(rectsWidth, currentMatC.Width - rectsx); rectsHeight = Math.Min(rectsHeight, currentMatC.Height - rectsy); areaBlack = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); } for (int i = 0; i < cam1TwoML.ResultDetails.Count; i++) { 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; // 修正区域位置,防止负数 rectsx = Math.Max(rectsx, 0); rectsy = Math.Max(rectsy, 0); rectsWidth = Math.Min(rectsWidth, currentMatC.Width - rectsx); rectsHeight = Math.Min(rectsHeight, currentMatC.Height - rectsy); string blockIndex = cam1TwoML.ResultDetails[i].LabelDisplay; //防止按钮在最右边导致定位块识别是2 + 防止定位能效贴和第3块相同,将定位能效贴改成4 if (keyValueResult.Keys.Contains(blockIndex)) { int indexof = keyValueResult.Keys.ToList().IndexOf(blockIndex); int rectsxof = cam1TwoML.ResultDetails[indexof].Rect.X; int rectsYof = cam1TwoML.ResultDetails[indexof].Rect.Y; if (rectsx > rectsxof) { blockIndex = "3"; } if (rectsy > rectsYof) { continue; } } Rect area2 = new Rect(0, 0, 0, 0); if (blockIndex == "2") // 根据旋钮扩大范围 { if ((areaBlack.X + areaBlack.Width) < (rectsx + rectsWidth)) { areaBlack.X = Math.Max(areaBlack.X - rectsx, 0); areaBlack.Y = Math.Max(areaBlack.Y - rectsy, 0); areaBlack.Width = Math.Min(areaBlack.Width, currentMatC.Width - areaBlack.X); areaBlack.Height = Math.Min(areaBlack.Height, currentMatC.Height - areaBlack.Y); area2 = areaBlack; } string TwoRectStr = CheckDiffSciHelper.rectChangeStr(area2); xK_HisenceWord.TwoRect = TwoRectStr; } Stopwatch sw = Stopwatch.StartNew(); sw.Start(); int extendHeight = 50; rectsHeight += extendHeight; rectsHeight = Math.Min(rectsHeight, currentMatC.Height - rectsy); Rect area = new Rect(rectsx, rectsy, rectsWidth, rectsHeight); Mat matCut = new Mat(mResultCut, 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.7) { 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; string filenameone = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString(); switch (blockIndex) { case "1"://完全匹配 重量信息 { xK_HisenceWord.OneblockPath = CutSavePath; xK_HisenceWord.OneblockMainWord = MainWoidStr; xK_HisenceWord.OneblockText = TextWoidStr; SQLStr = SQlxK_HisenceWord.OneblockText; string SQLStr2 = SQlxK_HisenceWord.OneblockMainWord; if (!saveimage) { bool ssD = ManagerModelHelper.StrMatch(SQLStr, xK_HisenceWord.OneblockText); Console.Write(SQLStr); bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.OneblockMainWord, SQLStr2); if (!OneIF1 || !ssD) { OneIF = false; //显示错误的板 DisplayResult(mLcut); Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 1); string Path_1 = Path.Combine("D:\\Hisence\\Test\\1\\ng", filenameone + "_res.png"); Cv2.ImWrite(Path_1, mLcut.ResultMap.ToMat()); } else { OneIF = true; Defet_OnDetectionDone(OKMat, 1); string Path_2 = Path.Combine("D:\\Hisence\\Test\\1\\ok", filenameone + "_res.png"); Cv2.ImWrite(Path_2, OKMat); } } } 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); bool iswhite = IsMostlyWhite(PathSql); int centerX = rectsql.X + rectsql.Width / 2; int centerY = rectsql.Y + rectsql.Height / 2; // 确定新的矩形框的左上角坐标和宽高 int rectSize = 60; // 30像素向外拓展 int rectX = Math.Max(0, centerX - rectSize / 2); int rectY = Math.Max(0, centerY - rectSize / 2); int rectWidth = Math.Min(rectSize, rectsql.Width - rectX); int rectHeight = Math.Min(rectSize, rectsql.Height - rectY); // 创建新的矩形框 Rect newRect = new Rect(rectX, rectY, rectWidth, rectHeight); string color = BtnColor(CutBlockMat, newRect); this.Invoke(new Action(() => { textBox2.Text = color; })); Mat matresult = CutBlockMat.Clone(); juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat,ref matresult, rectsql, rectDet, iswhite, "D://Hisence//Test"); // juanjiMatch = true; if (!OneIF1 || !juanjiMatch) { OneIF = false; //DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(matresult, 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; bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.ThreeblockMainWord, SQlxK_HisenceWord.ThreeblockMainWord); Rect rect = new Rect(0, 0, 0, 0); string PathSql = SQlxK_HisenceWord.ThreeblockPath; bool iswhite = IsMostlyWhite(PathSql); juanjiMatch = CheckDiffSciHelper1.CheckDiffSci(PathSql, CutBlockMat, rect, rect, iswhite, "D://Hisence//Test1"); if (!OneIF1 || !juanjiMatch) { OneIF = true;//待修改6.28 /* DisplayResult(mLcut); //显示错误的板 // mLcut.ResultMap; Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 3); */ Defet_OnDetectionDone(OKMat, 3); } else { OneIF = true; 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; // bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.FourblockMainWord, SQlxK_HisenceWord.FourblockMainWord); // Rect rect = new Rect(0, 0, 0, 0); // string PathSql = SQlxK_HisenceWord.FourblockPath; // juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rect, rect, false, "D://Hisence//Test"); // if (!OneIF1 || !juanjiMatch) // { // OneIF = false; // DisplayResult(mLcut); // //显示错误的板 // // mLcut.ResultMap; // Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 4); // } // else // { // OneIF = true; // 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; // bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.FiveblockMainWord, SQlxK_HisenceWord.FiveblockMainWord); // Rect rect = new Rect(0, 0, 0, 0); // string PathSql = SQlxK_HisenceWord.FiveblockMainWord; // juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rect, rect, false, "D://Hisence//Test"); // if (!OneIF1 || !juanjiMatch) // { // OneIF = false; // DisplayResult(mLcut); // //显示错误的板 // // mLcut.ResultMap; // Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 5); // } // else // { // OneIF = true; // 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; // bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.SixblockMainWord, SQlxK_HisenceWord.SixblockMainWord); // OneIF1 = false;//测试 // Rect rect = new Rect(0, 0, 0, 0); // string PathSql = SQlxK_HisenceWord.SixblockPath; // //第六块卷积设置一直为true // juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rect, rect, false, "D://Hisence//Test"); // juanjiMatch = true; // if (!OneIF1 || !juanjiMatch) // { // OneIF = false; // // DisplayResult(mLcut); // //显示错误的板 // // mLcut.ResultMap; // Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 6); // } // else // { // OneIF = true; // 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; // bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.SevenblockMainWord, SQlxK_HisenceWord.SevenblockMainWord); // Rect rect = new Rect(0, 0, 0, 0); // string PathSql = SQlxK_HisenceWord.SevenblockPath; // juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rect, rect, false, "D://Hisence//Test"); // if (!OneIF1 || !juanjiMatch) // { // OneIF = false; // //DisplayResult(mLcut); // //显示错误的板 // // mLcut.ResultMap; // Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 7); // } // else // { // OneIF = true; // 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; // bool OneIF1 = ManagerModelHelper.StrMatch2(xK_HisenceWord.EightblockMainWord, SQlxK_HisenceWord.EightblockMainWord); // Rect rect = new Rect(0, 0, 0, 0); // string PathSql = SQlxK_HisenceWord.EightblockPath; // juanjiMatch = CheckDiffSciHelper.CheckDiffSci(PathSql, CutBlockMat, rect, rect, false, "D://Hisence//Test"); // if (!OneIF1 || !juanjiMatch) // { // OneIF = false; // // DisplayResult(mLcut); // //显示错误的板 // // mLcut.ResultMap; // Defet_OnDetectionDone(mLcut.ResultMap.ToMat(), 8); // } // else // { // OneIF = true; // Defet_OnDetectionDone(OKMat, 8); // } // } // } // break; } string filename = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString(); string txtLog = "D://Hisence//" + filename + "logsMatch.log"; using (StreamWriter sw = new StreamWriter(txtLog, true)) { sw.WriteLine("块" + blockIndex + "卷积匹配" + juanjiMatch); sw.WriteLine("块" + blockIndex + "数据库" + SQLStr + "关键字" + MainWoidStr + "结果" + OneIF + "\n"); sw.WriteLine("块" + blockIndex + " 所有字 " + TextWoidStr + "\n"); sw.Flush(); } return OneIF; } static bool IsMostlyWhite(string imagePath) { Bitmap bitmap = new Bitmap(imagePath); int width = bitmap.Width; int height = bitmap.Height; int blackCount = 0; int whiteCount = 0; int rectSize = 30; for (int y = height - rectSize; y < height; y++) { for (int x = 0; x < rectSize; x++) { Color pixelColor = bitmap.GetPixel(x, y); int r = pixelColor.R; int g = pixelColor.G; int b = pixelColor.B; // 判断是否为黑色 if (r <= 100 && g <= 100 && b <= 100) { blackCount++; } else { whiteCount++; } } } int totalPixels = width * height; double blackRatio = (double)blackCount / totalPixels; // 如果黑色比例大于等于0.6,返回false,否则返回true return blackRatio < 0.6; } 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); } } static string BtnColor(Mat img, Rect rect) { // 提取指定区域 Mat roi = new Mat(img, rect); // 计算平均颜色 Scalar mean = Cv2.Mean(roi); // 获取平均颜色的RGB值 double r = mean.Val2; double g = mean.Val1; double b = mean.Val0; // 计算平均灰度值 double averageGray = (r + g + b) / 3; // 判断颜色类别 if (averageGray < 60) { return "黑色"; } else if (averageGray >= 60 && averageGray <= 150) { return "银色"; } else { return "白色"; } } private void handStopBtn_Click(object sender, EventArgs e) { melsecPLCTCPDriver.WriteInt("550", 1); } private void HandRuningBtn_Click(object sender, EventArgs e) { melsecPLCTCPDriver.WriteInt("550", 0); } /// /// 软件关闭 /// /// /// private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { melsecPLCTCPDriver.WriteInt("550", 0); melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0); melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0); } private void panel1_Paint(object sender, PaintEventArgs e) { } private void button1_Click_1(object sender, EventArgs e) { if (!m_sKEYENCEBar.IsNullOrEmpty()) { OcrBarBox.Text = m_sKEYENCEBar; } } private void canvas1_Load(object sender, EventArgs e) { } private void canvas7_Load(object sender, EventArgs e) { } private void CloseDecBtn_Click(object sender, EventArgs e) { meachineState = MeachineState.machine_closing; melsecPLCTCPDriver.WriteInt("550", 0); melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0); melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0); } private void label24_Click(object sender, EventArgs e) { } private void label25_Click(object sender, EventArgs e) { } private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { } private void label18_Click(object sender, EventArgs e) { } private void canvas2_Load(object sender, EventArgs e) { } private void label27_Click(object sender, EventArgs e) { } private void label37_Click(object sender, EventArgs e) { } private void groupBox9_Enter(object sender, EventArgs e) { } } }