cam0 to camOCR

This commit is contained in:
2025-11-05 10:37:51 +08:00
parent 3173e91d95
commit 299502b23c

View File

@@ -112,7 +112,7 @@ namespace TetraPackOCR
/// <summary> /// <summary>
/// 相机对象 1和2 /// 相机对象 1和2
/// </summary> /// </summary>
IDevice m_dev_cam0, m_dev_cam1; IDevice m_dev_cam_ocr, m_dev_cam1;
List<IDeviceInfo> DeviceList; List<IDeviceInfo> DeviceList;
public string ImagePixelFormat = ""; //图像格式设置 public string ImagePixelFormat = ""; //图像格式设置
@@ -143,7 +143,7 @@ namespace TetraPackOCR
this.Enabled = false; this.Enabled = false;
Action action = (() => Action action = (() =>
{ {
InitializeCamer1(); InitializeCamerOCR();
InitializeCamer2(); InitializeCamer2();
InitializePaddleOCR(); InitializePaddleOCR();
@@ -263,31 +263,29 @@ namespace TetraPackOCR
#region #region
#region 1 OCR相机 #region 1 OCR相机
private void InitializeCamer1() private void InitializeCamerOCR()
{ {
try try
{ {
cam0Opened = false; camOCROpened = false;
DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机 DeviceList = Enumerator.EnumerateDevices(); //发现设备,搜索所有大华相机
m_dev_cam_ocr = Enumerator.GetDeviceByKey("Machine Vision:CK21686DAK00001");//通过"设备厂商名:设备序列号"获取
// m_dev_cam0 = Enumerator.GetDeviceByIndex(0);//通过索引获取 if (m_dev_cam_ocr == null)
m_dev_cam0 = Enumerator.GetDeviceByKey("Machine Vision:CK21686DAK00001");//通过"设备厂商名:设备序列号"获取
if (m_dev_cam0 == null)
{ {
log.Error("未发现OCR相机请检查相机连接"); log.Error("未发现OCR相机请检查相机连接");
return; return;
} }
m_dev_cam0.CameraOpened += m_dev0_CameraOpened; m_dev_cam_ocr.CameraOpened += m_dev_cam_ocr_CameraOpened;
m_dev_cam0.CameraClosed += m_dev0_CameraClosed; m_dev_cam_ocr.CameraClosed += m_dev_cam_ocr_CameraClosed;
m_dev_cam0.ConnectionLost += m_dev0_ConnectionLost; m_dev_cam_ocr.ConnectionLost += m_dev_cam_ocr_ConnectionLost;
if (!m_dev_cam0.Open()) if (!m_dev_cam_ocr.Open())
{ {
MessageBox.Show("OCR相机打开失败"); MessageBox.Show("OCR相机打开失败");
} }
// 设置图像格式 // 设置图像格式
// set PixelFormat // set PixelFormat
using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) using (IEnumParameter p = m_dev_cam_ocr.ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
{ {
ImagePixelFormat = "BayerRG8"; ImagePixelFormat = "BayerRG8";
//ImagePixelFormat = "Mono8"; //ImagePixelFormat = "Mono8";
@@ -296,73 +294,68 @@ namespace TetraPackOCR
// 设置曝光 // 设置曝光
using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.ExposureTime]) using (IFloatParameter p = m_dev_cam_ocr.ParameterCollection[ParametrizeNameSet.ExposureTime])
{ {
p.SetValue(800000); p.SetValue(800000);
} }
// 设置增益 // 设置增益
using (IFloatParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.GainRaw]) using (IFloatParameter p = m_dev_cam_ocr.ParameterCollection[ParametrizeNameSet.GainRaw])
{ {
p.SetValue(2.5); p.SetValue(2.5);
} }
using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.AcquisitionMode]) using (IEnumParameter p = m_dev_cam_ocr.ParameterCollection[ParametrizeNameSet.AcquisitionMode])
{ {
p.SetValue("Continuous"); p.SetValue("Continuous");
} }
using (IEnumParameter p = m_dev_cam0.ParameterCollection[ParametrizeNameSet.TriggerMode]) using (IEnumParameter p = m_dev_cam_ocr.ParameterCollection[ParametrizeNameSet.TriggerMode])
{ {
p.SetValue("On"); p.SetValue("On");
} }
//if (!m_dev_cam0.Open()) m_dev_cam_ocr.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_OCR;
//{ m_dev_cam_ocr.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_OCR;
// MessageBox.Show(@"OCR相机连接失败");
// return;
//}
m_dev_cam0.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_0;
m_dev_cam0.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_0;
// 打开Software Trigger // 打开Software Trigger
// Set Software Trigger // Set Software Trigger
m_dev_cam0.TriggerSet.Open(TriggerSourceEnum.Software); m_dev_cam_ocr.TriggerSet.Open(TriggerSourceEnum.Software);
if (!m_dev_cam0.GrabUsingGrabLoopThread()) if (!m_dev_cam_ocr.GrabUsingGrabLoopThread())
{ {
// 开启采集失败 // 开启采集失败
log.Error("开启采集失败"); log.Error("开启采集失败");
return; return;
} }
cam0Opened = true; camOCROpened = true;
log.Info("OCR相机加载完毕"); log.Info("OCR相机加载完毕");
} }
catch (Exception ex) catch (Exception ex)
{ {
cam0Opened = false; camOCROpened = false;
log.Error("OCR相机加载失败"); log.Error("OCR相机加载失败");
m_dev_cam0 = null; m_dev_cam_ocr = null;
} }
} }
private bool cam0Opened = false; private bool camOCROpened = false;
private bool cam1Opened = false; private bool cam1Opened = false;
#endregion #endregion
#region 1 #region 1
void m_dev0_ConnectionLost(object sender, EventArgs e) void m_dev_cam_ocr_ConnectionLost(object sender, EventArgs e)
{ {
MessageBox.Show(m_dev_cam0.DeviceInfo.Key + "OCR相机断线"); MessageBox.Show(m_dev_cam_ocr.DeviceInfo.Key + "OCR相机断线");
} }
void m_dev0_CameraClosed(object sender, EventArgs e) void m_dev_cam_ocr_CameraClosed(object sender, EventArgs e)
{ {
MessageBox.Show(m_dev_cam0.DeviceInfo.Key + "OCR相机关闭"); MessageBox.Show(m_dev_cam_ocr.DeviceInfo.Key + "OCR相机关闭");
} }
void m_dev0_CameraOpened(object sender, EventArgs e) void m_dev_cam_ocr_CameraOpened(object sender, EventArgs e)
{ {
// MessageBox.Show(m_dev_cam0.DeviceInfo.Key + "启动");
} }
void StreamGrabber_GrabStarted_0(object sender, EventArgs e) void StreamGrabber_GrabStarted_OCR(object sender, EventArgs e)
{ {
log.Info("OCR相机启动码流"); log.Info("OCR相机启动码流");
} }
@@ -372,7 +365,7 @@ namespace TetraPackOCR
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void StreamGrabber_ImageGrabbed_0(object sender, GrabbedEventArgs e) private void StreamGrabber_ImageGrabbed_OCR(object sender, GrabbedEventArgs e)
{ {
try try
{ {
@@ -442,11 +435,6 @@ namespace TetraPackOCR
{ {
p.SetValue("On"); p.SetValue("On");
} }
//if (!m_dev_cam1.Open())
//{
// MessageBox.Show(@"定位相机连接失败");
// return;
//}
m_dev_cam1.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_1; m_dev_cam1.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed_1;
m_dev_cam1.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_1; m_dev_cam1.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted_1;
// 打开Software Trigger // 打开Software Trigger
@@ -485,7 +473,7 @@ namespace TetraPackOCR
void m_dev1_CameraOpened(object sender, EventArgs e) void m_dev1_CameraOpened(object sender, EventArgs e)
{ {
// MessageBox.Show(m_dev_cam0.DeviceInfo.Key + "启动");
} }
void StreamGrabber_GrabStarted_1(object sender, EventArgs e) void StreamGrabber_GrabStarted_1(object sender, EventArgs e)
@@ -564,14 +552,14 @@ namespace TetraPackOCR
void ClossCam() void ClossCam()
{ {
//注销相机事件 //注销相机事件
if (m_dev_cam0 != null) if (m_dev_cam_ocr != null)
{ {
m_dev_cam0.CameraOpened -= m_dev0_CameraOpened; m_dev_cam_ocr.CameraOpened -= m_dev_cam_ocr_CameraOpened;
m_dev_cam0.CameraClosed -= m_dev0_CameraClosed; m_dev_cam_ocr.CameraClosed -= m_dev_cam_ocr_CameraClosed;
m_dev_cam0.ConnectionLost -= m_dev0_ConnectionLost; m_dev_cam_ocr.ConnectionLost -= m_dev_cam_ocr_ConnectionLost;
m_dev_cam0.ShutdownGrab(); m_dev_cam_ocr.ShutdownGrab();
m_dev_cam0.Dispose(); m_dev_cam_ocr.Dispose();
m_dev_cam0 = null; m_dev_cam_ocr = null;
} }
if (m_dev_cam1 != null) if (m_dev_cam1 != null)
{ {
@@ -952,6 +940,23 @@ namespace TetraPackOCR
} }
} }
///判断当前Lans决定结果显示数量 ///判断当前Lans决定结果显示数量
InitLableColumn();
this.btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
orderLoaded = true;
btn_StarDet_manual.Enabled = true;
btn_StarDet_manual.BackColor = Color.LimeGreen;
}
catch (Exception ex)
{
log.Error("数据解析错误,请检查订单号是否正确");
this.btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
}
}
private void InitLableColumn()
{
switch (NumberOfLanes) switch (NumberOfLanes)
{ {
case 1: case 1:
@@ -1091,19 +1096,6 @@ namespace TetraPackOCR
})); }));
break; break;
} }
this.btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
orderLoaded = true;
btn_StarDet_manual.Enabled = true;
btn_StarDet_manual.BackColor = Color.LimeGreen;
}
catch (Exception ex)
{
log.Error("数据解析错误,请检查订单号是否正确");
this.btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
}
} }
/// <summary> /// <summary>
/// 手动ocr /// 手动ocr
@@ -1112,7 +1104,7 @@ namespace TetraPackOCR
/// <param name="e"></param> /// <param name="e"></param>
private void btn_manualOcr_Click(object sender, EventArgs e) private void btn_manualOcr_Click(object sender, EventArgs e)
{ {
m_dev_cam0.ExecuteSoftwareTrigger();//相机1触发 = OCR拍照 m_dev_cam_ocr.ExecuteSoftwareTrigger();//相机1触发 = OCR拍照
log.Info("手动触发OCR"); log.Info("手动触发OCR");
} }
/// <summary> /// <summary>
@@ -1128,7 +1120,7 @@ namespace TetraPackOCR
private bool autorunFlag = false; private bool autorunFlag = false;
private void btn_StarDet_manual_Click(object sender, EventArgs e) private void btn_StarDet_manual_Click(object sender, EventArgs e)
{ {
if (cam0Opened == false || cam1Opened == false) if (camOCROpened == false || cam1Opened == false)
{ {
MessageBox.Show("相机未打开,无法进行检测,请检查相机连接及状态!"); MessageBox.Show("相机未打开,无法进行检测,请检查相机连接及状态!");
return; return;
@@ -1140,27 +1132,12 @@ namespace TetraPackOCR
return; return;
} }
this.Invoke(new Action(() => if (MessageBox.Show("确认OCR相机处于零点位置", "提示", MessageBoxButtons.YesNo) == DialogResult.No)
{ {
this.lbl_L1_verOcrRs.Text = "未启用"; return;
this.lbl_L1_verOcrRs.BackColor = Color.Gray; }
this.lbl_L2_verOcrRs.Text = "未启用";
this.lbl_L2_verOcrRs.BackColor = Color.Gray; InitLableColumn();
this.lbl_L3_verOcrRs.Text = "未启用";
this.lbl_L3_verOcrRs.BackColor = Color.Gray;
this.lbl_L4_verOcrRs.Text = "未启用";
this.lbl_L4_verOcrRs.BackColor = Color.Gray;
this.lbl_L5_verOcrRs.Text = "未启用";
this.lbl_L5_verOcrRs.BackColor = Color.Gray;
this.lbl_L6_verOcrRs.Text = "未启用";
this.lbl_L6_verOcrRs.BackColor = Color.Gray;
this.lbl_L7_verOcrRs.Text = "未启用";
this.lbl_L7_verOcrRs.BackColor = Color.Gray;
this.lbl_L8_verOcrRs.Text = "未启用";
this.lbl_L8_verOcrRs.BackColor = Color.Gray;
this.lbl_L9_verOcrRs.Text = "未启用";
this.lbl_L9_verOcrRs.BackColor = Color.Gray;
}));
autorunFlag = check_Autorun.Checked; autorunFlag = check_Autorun.Checked;
btn_StarDet_manual.Enabled = false; btn_StarDet_manual.Enabled = false;
@@ -1172,31 +1149,6 @@ namespace TetraPackOCR
log.Info("手动触发开始"); log.Info("手动触发开始");
} }
/// <summary>
/// 字符排序
/// </summary>
/// <param name="d">设计</param>
/// <param name="l"></param>
/// <param name="c"></param>
/// <returns></returns>
private string ExecelGetOcrDealWithForShow(string d, string l)
{
string rescult = "";
string[] dd = d.Split('-');
//for (int i = 0; i < dd.Length-1; i++)
//{
// rescult = rescult + dd[0];
//}
//rescult = dd[0].Remove(0, 1);
string[] ll = l.Split(',');
for (int i = 0; i < ll.Length; i++)
{
ll[i] = ll[i].Replace(" ", ""); ll[i] = ll[i].Replace("[", ""); ll[i] = ll[i].Replace("]", "");
string[] str = ll[i].Split('-');
rescult = rescult + dd[1] + str[1] + str[0];
}
return rescult;
}
private List<string> ExecelGetOcrText(string design, string layer) private List<string> ExecelGetOcrText(string design, string layer)
{ {
List<string> result = new List<string>(); List<string> result = new List<string>();
@@ -1281,7 +1233,7 @@ namespace TetraPackOCR
log.Info("PLC触发OCR相机正在拍照计算..."); log.Info("PLC触发OCR相机正在拍照计算...");
try try
{ {
m_dev_cam0.ExecuteSoftwareTrigger(); m_dev_cam_ocr.ExecuteSoftwareTrigger();
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -1599,66 +1551,6 @@ namespace TetraPackOCR
ShowTheLansRs(mMatchingStr, (float)m1 / (float)ocrTextResult.Count); ShowTheLansRs(mMatchingStr, (float)m1 / (float)ocrTextResult.Count);
} }
//byte[] ocrimagebyte = File.ReadAllBytes(file.FileName);
//Bitmap Bmp = new Bitmap(new MemoryStream(ocrimagebyte));
//List<string> lastocr = new List<string>();
//OCRResult ocrResult = Engine.DetectText(ocrimagebyte);
//// log.Debug("读取原始数据1" + ocrResult.JsonText);
//List<Point> pointsList = new List<Point>();
//string[] sd = Design.Split('-');
//foreach (var item in ocrResult.TextBlocks) //将检测框绘制在图片上
//{
// if (item.Text.Contains(sd[1]))
// {
// using (Graphics g = Graphics.FromImage(Bmp))
// {
// g.DrawPolygon(new Pen(Brushes.Red, 2), item.BoxPoints.Select(x => new PointF() { X = x.X, Y = x.Y }).ToArray());
// }
// //lastocr.Add(item.Text);
// pointsList.Add(new Point(item.BoxPoints[0].X, item.BoxPoints[0].Y, item.Text));
// }
//}
//List<Point> paixujeguo = paixu(pointsList);
//foreach (var it in paixujeguo)
//{
// lastocr.Add(it.txt);
//}
////对图像显示区更新
//Ocr_picBox.BackgroundImage = null;
//Ocr_picBox.BackgroundImage = Bmp;
//txt_readOcrResultShow.Clear();
//if (!Coprinted_ordeFlag) //判断是否为共印订单
//{
// txt_readOcrResultShow.Text = GETOCR(lastocr, Design);
// log.Info("字符读取结果:" + GETOCR(lastocr, Design));
// int distance = CalculateAcc(ExecelGetOcrDealWithForShow(Design, Layers), GETOCR(lastocr, Design));
// float maxLength = Math.Max(ExecelGetOcrDealWithForShow(Design, Layers).Length, GETOCR(lastocr, Design).Length);
// float strSimilarity = (maxLength - distance) / maxLength;
// ShowTheLansRs(mMatchingStr, strSimilarity);
//}
//else
//{
// txt_readOcrResultShow.Text = GETOCR(lastocr, Design);
// log.Info("字符读取结果:" + GETOCR(lastocr, Design));
// int distance = CalculateAcc(verocr[mMatchingStr], GETOCR(lastocr, Design));
// float maxLength = Math.Max(verocr[mMatchingStr].Length, GETOCR(lastocr, Design).Length);
// float strSimilarity = (maxLength - distance) / maxLength;
// ShowTheLansRs(mMatchingStr, strSimilarity);
//}
NoticePLCCompleteOCR(); NoticePLCCompleteOCR();
} }
} }
@@ -1810,50 +1702,6 @@ namespace TetraPackOCR
return "未能匹配到对应字符请查看产品是否超标,或订单号是否正确"; return "未能匹配到对应字符请查看产品是否超标,或订单号是否正确";
} }
} }
/// <summary>
/// 使用Levenshtein Distance计算字符串相似度
/// </summary>
/// <param name="readocr">excel取到的验证字符</param>
/// <param name="getocr">读取到的字符</param>
int CalculateAcc(string readocr, string getocr)
{
int columnSize = getocr.Length;
int rowSize = readocr.Length;
if (columnSize == 0)
{
return rowSize;
}
if (rowSize == 0)
{
return columnSize;
}
int[,] matrix = new int[rowSize + 1, columnSize + 1];
for (int i = 0; i <= columnSize; i++)
{
matrix[0, 1] = i;//ai提示此处应为matrix[0,i]=i;
}
for (int j = 1; j <= rowSize; j++)//ai提示此处应为j=0
{
matrix[j, 0] = j;
}
for (int i = 0; i < rowSize; i++)
{
for (int j = 0; j < columnSize; j++)
{
int sign;
if (getocr[j].Equals(readocr[i]))
sign = 0;
else
sign = 1;
matrix[i + 1, j + 1] = Math.Min(Math.Min(matrix[i, j] + sign, matrix[i + 1, j] + 1), matrix[i, j + 1] + 1);
}
}
return matrix[rowSize, columnSize];
}
private void button1_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e)
{ {
btn_StarDet_manual.Enabled = true; btn_StarDet_manual.Enabled = true;