实例介绍
【实例简介】实例中包涵视觉定位,halcon读标签
1,根据大视野自动计算出产品位置,根据小视野计算可以贴标签的位置
2,项目中使用basler相机取向,halcon视觉计算
【实例截图】
【核心代码】
using CommunicationServer.Class;
using FPCInspection.Config;
//using HalconDotNet;
using Nobug.Model.Camera;
using Nobug.Utility;
using Nobug.Vision;
using Nobug.Vision.Algrithom;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using FindBarcodeLog;
namespace FindBarcode
{
public partial class FormMain : Form
{
private Thread showImageThread;
private Thread calculateBigThread;
private Thread calculateSmallThread;
private MesServer serverBig;
private MesServer serverSmall;
public BaslerCamera BigCam;
public BaslerCamera SmallCam;
/// <summary>
/// 声明委托 和 事件
/// </summary>
/// <param name="value"></param>
private delegate void SetRichTextSN(System.Windows.Forms.RichTextBox pButton, string mStr, Color pColor, string iType);
private Log pLog = new Log();
public FormMain()
{
InitializeComponent();
this.Size = new Size(1532, 1138);
}
private void btn_LoadImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "图像文件(*.bmp)|*.bmp";
DialogResult dr = ofd.ShowDialog();
if (dr == DialogResult.OK)
{
System.Drawing.Image img = System.Drawing.Image.FromFile(ofd.FileName);
this.drawingBoard1.OriginalImage = new Bitmap(img);
this.drawingBoard2.OriginalImage = new Bitmap(img);
//this.drawingBoard1.ClearAll();
img.Dispose();
drawingBoard1.CreatedShapes.Clear();
this.drawingBoard1.Fit2Screen();
}
}
private void showLabel(bool isLabelFound, Rectangle2NB rect, int position, string message, Color color)
{
if (isLabelFound)
{
rect.LineWidth = 2;
rect.PaintColor2 = Color.Red;
drawingBoard1.CreatedShapes.Add(rect);
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
Angle = rect.Angle,
FontSize = 60,
StartPoint = new PointF((float)rect.Center.X, (float)rect.Center.Y),
Text = string.Format("R:{0},C:{1},A:{2}",
rect.Center.X.ToString("0.00"),
rect.Center.Y.ToString("0.00"),
(rect.Angle * 360 / 6.28).ToString("0.00")),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard1.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)rect.Center.X, (float)rect.Center.Y)
});
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, position),
Text = string.Format("找到{0}标签!", message),
PaintColor2 = color
});
}
else
{
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, position),
Text = string.Format("未找到{0}标签!", message),
PaintColor2 = color
});
}
}
//手自动公用变量
//所有可能有条码的区域
private List<Rectangle2NB> AllLabelRects = null;
//所有可能直接贴标的区域
private List<Rectangle2NB> AllPasteRects = null;
//ReelId区域
private Rectangle2NB ReelIdRect = null;
//ReelId的条码内容
private string ReelIdContent;
//在没有可直接贴标区域时,计算出来的可贴标区域
private Rectangle2NB PasteRect;
//覆盖老贴标区域的贴标位置
private Rectangle2NB PasteRectOld;
//拍大视野是否已经找到贴条码区域
private bool IsPasteAreaFound = false;
//大视野相机计算 1.查找是否有已经贴过的类似于Reel但颜色不同的标签
// 2.查找Reel标签
// 3.查找可能的标签区域
private void btn_DrawRoi_Click(object sender, EventArgs e)
{
bool showCandiReg = true;
drawingBoard1.CreatedShapes.Clear();
List<Rectangle2NB> labelRectsCandi = null;
long time = 0;
Bitmap bmp = drawingBoard1.OriginalImage;
try
{
VisionAlgrithom.BigSearch(VisionAlgrithom.Bitmap2HObjectBpp32(bmp),
GlobalVariable.CurrentSystemConfig.ReelLowVal, GlobalVariable.CurrentSystemConfig.ReelHighVal,
GlobalVariable.CurrentSystemConfig.BlueLowVal, GlobalVariable.CurrentSystemConfig.BlueHighVal,
GlobalVariable.CurrentSystemConfig.OrangeLowVal, GlobalVariable.CurrentSystemConfig.OrangeHighVal,
GlobalVariable.CurrentSystemConfig.YellowLowVal, GlobalVariable.CurrentSystemConfig.YellowHighVal,
25000, 3000000,
128, 150, 180, 100000,
GlobalVariable.CurrentSystemConfig.BarcodeThreshold, GlobalVariable.CurrentSystemConfig.BarcodeWidth, 200, GlobalVariable.CurrentSystemConfig.AngleExtend, GlobalVariable.CurrentSystemConfig.ClosingArea,
out AllPasteRects,
out AllLabelRects,
out labelRectsCandi,
out time);
bmp.Dispose();
if (AllPasteRects != null && AllPasteRects.Count > 0)
{
for (int i = 0; i < AllPasteRects.Count; i )
{
AllPasteRects[i].LineWidth = 2;
AllPasteRects[i].PaintColor2 = Color.Red;
drawingBoard1.CreatedShapes.Add(AllPasteRects[i]);
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
Angle = AllPasteRects[i].Angle,
FontSize = 60,
StartPoint = new PointF((float)AllPasteRects[i].Center.X, (float)AllPasteRects[i].Center.Y),
Text = string.Format("R:{0},C:{1},A:{2}",
AllPasteRects[i].Center.X.ToString("0.00"),
AllPasteRects[i].Center.Y.ToString("0.00"),
(AllPasteRects[i].Angle * 360 / 6.28).ToString("0.00")),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard1.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)AllPasteRects[i].Center.X, (float)AllPasteRects[i].Center.Y)
});
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 280),
Text = string.Format("找到{0}个贴标区,如红色框所示!", AllPasteRects.Count),
PaintColor2 = Color.LimeGreen
});
}
PasteRectOld = AllPasteRects[0];
}
if (AllLabelRects != null && AllLabelRects.Count > 0)
{
for (int i = 0; i < AllLabelRects.Count; i )
{
AllLabelRects[i].LineWidth = 2;
AllLabelRects[i].PaintColor2 = Color.Blue;
drawingBoard1.CreatedShapes.Add(AllLabelRects[i]);
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
Angle = AllLabelRects[i].Angle,
FontSize = 60,
StartPoint = new PointF((float)AllLabelRects[i].Center.X, (float)AllLabelRects[i].Center.Y),
Text = string.Format("R:{0},C:{1},A:{2}",
AllLabelRects[i].Center.X.ToString("0.00"),
AllLabelRects[i].Center.Y.ToString("0.00"),
(AllLabelRects[i].Angle * 360 / 6.28).ToString("0.00")),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard1.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)AllLabelRects[i].Center.X, (float)AllLabelRects[i].Center.Y)
});
}
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 560),
Text = string.Format("找到{0}个读条码区,如蓝色框所示!", AllLabelRects.Count),
PaintColor2 = Color.LimeGreen
});
}
if (showCandiReg)
{
if (labelRectsCandi != null && labelRectsCandi.Count > 0)
{
for (int i = 0; i < labelRectsCandi.Count; i )
{
labelRectsCandi[i].LineWidth = 1;
labelRectsCandi[i].PaintColor2 = Color.Pink;
drawingBoard1.CreatedShapes.Add(labelRectsCandi[i]);
}
}
}
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 730),
Text = string.Format("总耗时: {0} ms", time),
PaintColor2 = Color.White
});
drawingBoard1.Repaint();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btn_SmallReadBarcode_Click(object sender, EventArgs e)
{
bool isExistReel = false;
string reel = "";
drawingBoard2.CreatedShapes.Clear();
List<string> barcodeStr = new List<string>();
List<Rectangle2NB> barcodeRects = null;
VisionAlgrithom.SmallRead(VisionAlgrithom.Bitmap2HObjectBpp32(drawingBoard2.OriginalImage),
out barcodeStr,
out barcodeRects,
out PasteRect,
out isExistReel,
out reel);
if (barcodeRects != null && barcodeRects.Count > 0)
{
for (int i = 0; i < barcodeRects.Count; i )
{
barcodeRects[i].LineWidth = 1;
barcodeRects[i].PaintColor2 = Color.Blue;
drawingBoard2.CreatedShapes.Add(barcodeRects[i]);
this.drawingBoard2.CreatedShapes.Add(new TextNB()
{
FontSize = 45,
StartPoint = new PointF((float)barcodeRects[i].Center.X, (float)barcodeRects[i].Center.Y),
Angle = barcodeRects[i].Angle,
Text = string.Format(barcodeStr[i]),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard2.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)barcodeRects[i].Center.X, (float)barcodeRects[i].Center.Y)
});
}
}
if(PasteRect != null)
{
PasteRect.LineWidth = 2;
PasteRect.PaintColor2 = Color.White;
this.drawingBoard2.CreatedShapes.Add(PasteRect);
}
drawingBoard2.Repaint();
if (!isExistReel)
MessageBox.Show("未找到ReelId", "ReelId", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show(string.Format("ReelId:{0}", reel), "ReelId", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btn_Cali_Click(object sender, EventArgs e)
{
}
private void cB_Rule_CheckedChanged(object sender, EventArgs e)
{
drawingBoard1.ShowRuler = cB_Rule.Checked;
drawingBoard2.ShowRuler = cB_Rule.Checked;
}
private void btn_AddPoint_Click(object sender, EventArgs e)
{
if(tC_9Point.SelectedTab == tP_Big)
{
if (cB_Rectangle.Checked)
this.drawingBoard1.DrawRectangle2 = true;
else
this.drawingBoard1.DrawCircle = true;
}
else if(tC_9Point.SelectedTab == tP_Small)
{
if (cB_Rectangle.Checked)
this.drawingBoard2.DrawRectangle2 = true;
else
this.drawingBoard2.DrawCircle = true;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
SetRunLog("启动程式");
#region System
LogHelper.Init(this);
GlobalVariable.CurrentSystemConfig = new SystemConfig();
//SystemConfig.Save(@"C:\\test.xml", GlobalVariable.CurrentSystemConfig);
SystemConfig.Load(@"C:\\test.xml", out GlobalVariable.CurrentSystemConfig);
nUD_BigAngleOffset.Value = (decimal)GlobalVariable.CurrentSystemConfig.BigAngleOffset;
nUD_SmallAngleOffset.Value = (decimal)GlobalVariable.CurrentSystemConfig.SmallAngleOffset;
this.drawingBoard1.DrawFinishHandler = DrawingBoard1_DrawFinishHandler;
this.drawingBoard2.DrawFinishHandler = DrawingBoard2_DrawFinishHandler;
#endregion
SetRunLog("连接相机");
#region Camera
List<string> camNames = CameraBase.EnumerateCamera(CameraType.BaslerCamera);
//Basler acA2500-14gm (21497018)
BigCam = new BaslerCamera("CamBig (23162592)");
//BigCam = new BaslerCamera("CamBig (23333162592)");
BigCam.CameraMode = CameraMode.Auto;
SmallCam = new BaslerCamera("CamSmall (22443331)");
//SmallCam = new BaslerCamera("Basler acA2500-14gm (21497018)");
SmallCam.CameraMode = CameraMode.Auto;
if (BigCam.Open())
{
//BigCam.ShowImage = showImage;
tSSL_BigCam.Image = Properties.Resources.Green_Rect;
//if (tabControl1.SelectedTab == tP_Big)
nUD_Exposure.Value = (decimal)BigCam.GetExposureTime();
}
else
{
tSSL_BigCam.Image = Properties.Resources.Yellow_Rect;
MessageBox.Show("大视野相机打开失败!", "相机", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (SmallCam.Open())
{
//SmallCam.ShowImage = showImage;
tSSL_SmallCam.Image = Properties.Resources.Green_Rect;
//if (tabControl1.SelectedTab != tP_Big)
//nUD_Exposure.Value = (decimal)SmallCam.GetExposureTime();
}
else
{
tSSL_SmallCam.Image = Properties.Resources.Yellow_Rect;
MessageBox.Show("小视野相机打开失败!", "相机", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
SetRunLog("打开服务连接");
serverBig = new MesServer("6001", "BigCam");
serverBig.posorneg = "Big";
serverBig.MesServerRunDisplayEvent = showComStatus;
serverBig.Start();
serverSmall = new MesServer("6002", "SmallCam");
serverSmall.posorneg = "Small";
serverSmall.MesServerRunDisplayEvent = showComStatus;
serverSmall.Start();
showImageThread = new Thread(showImage);
showImageThread.Start();
//netComThread = new Thread(netCom);
//netComThread.Start();
calculateBigThread = new Thread(calculateBig);
calculateBigThread.Start();
calculateSmallThread = new Thread(calculateSmall);
calculateSmallThread.Start();
#endregion
SetRunLog("启动完成");
}
private void DrawingBoard1_DrawFinishHandler(object sender, EventArgs e)
{
if (cB_Rectangle.Checked)
{
Rectangle2NB rect = (Rectangle2NB)((DrawEventArgs)e).Shape;
this.dGV_BigPixel9Point.Rows.Add();
this.dGV_BigPixel9Point.Rows[this.dGV_BigPixel9Point.Rows.Count - 1].Cells[0].Value = rect.Center.Y.ToString("0.0");
this.dGV_BigPixel9Point.Rows[this.dGV_BigPixel9Point.Rows.Count - 1].Cells[1].Value = rect.Center.X.ToString("0.0");
}
else
{
CircleNB circle;
HObject img = VisionAlgrithom.Bitmap2HObjectBpp32(this.drawingBoard1.OriginalImage);
VisionAlgrithom.FindCaliMark(img, ((DrawEventArgs)e).Shape, out circle);
if (circle.Center.X != 0 && circle.Center.Y != 0)
{
PointNB center = new PointNB()
{
Center = new PointF(circle.Center.X, circle.Center.Y),
LineWidth = 3,
CrossSize = 20,
};
this.drawingBoard1.CreatedShapes.Add(center);
circle.LineWidth = 2;
circle.PaintColor2 = Color.Red;
this.drawingBoard1.CreatedShapes.Add(circle);
this.drawingBoard1.Repaint();
this.dGV_BigPixel9Point.Rows.Add();
this.dGV_BigPixel9Point.Rows[this.dGV_BigPixel9Point.Rows.Count - 1].Cells[0].Value = circle.Center.Y.ToString("0.0");
this.dGV_BigPixel9Point.Rows[this.dGV_BigPixel9Point.Rows.Count - 1].Cells[1].Value = circle.Center.X.ToString("0.0");
}
}
}
private void DrawingBoard2_DrawFinishHandler(object sender, EventArgs e)
{
if (cB_Rectangle.Checked)
{
Rectangle2NB rect = (Rectangle2NB)((DrawEventArgs)e).Shape;
this.dGV_Small9Point.Rows.Add();
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[0].Value = rect.Center.Y.ToString("0.0");
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[1].Value = rect.Center.X.ToString("0.0");
}
else
{
CircleNB circle;
HObject img = VisionAlgrithom.Bitmap2HObjectGray(this.drawingBoard2.OriginalImage);
VisionAlgrithom.FindCaliMark(img, ((DrawEventArgs)e).Shape, out circle);
if (circle.Center.X != 0 && circle.Center.Y != 0)
{
PointNB center = new PointNB()
{
Center = new PointF(circle.Center.X, circle.Center.Y),
LineWidth = 3,
CrossSize = 20,
};
this.drawingBoard2.CreatedShapes.Add(center);
circle.LineWidth = 2;
circle.PaintColor2 = Color.Red;
this.drawingBoard2.CreatedShapes.Add(circle);
this.drawingBoard2.Repaint();
this.dGV_Small9Point.Rows.Add();
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[0].Value = circle.Center.Y.ToString("0.0");
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[1].Value = circle.Center.X.ToString("0.0");
}
}
}
//bool firstShowBig = true;
//bool firstShowSmall = true;
//private void showImage(Bitmap bm)
//{
// this.BeginInvoke(new Action(() =>
// {
// if (rB_Big.Checked)
// {
// drawingBoard1.OriginalImage = bm;
// if (firstShowBig)
// {
// drawingBoard1.Fit2Screen();
// firstShowBig = false;
// }
// firstShowSmall = true;
// }
// else
// {
// drawingBoard1.OriginalImage = bm;
// if (firstShowSmall)
// {
// drawingBoard1.Fit2Screen();
// firstShowSmall = false;
// }
// firstShowBig = true;
// }
// }));
//}
private void btn_ContiGrab_Click(object sender, EventArgs e)
{
if (selectBigCam)
{
if(BigCam.CameraMode == CameraMode.Auto)
{
MessageBox.Show("请先切换至手动模式!", "相机采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (btn_ContiGrab.Text == "连续采集")
{
BigCam.Grab(true);
btn_ContiGrab.Text = "停止采集";
}
else
{
BigCam.Stop();
btn_ContiGrab.Text = "连续采集";
}
}
else
{
if (SmallCam.CameraMode == CameraMode.Auto)
{
MessageBox.Show("请先切换至手动模式!", "相机采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (btn_ContiGrab.Text == "连续采集")
{
SmallCam.Grab(true);
btn_ContiGrab.Text = "停止采集";
}
else
{
SmallCam.Stop();
btn_ContiGrab.Text = "连续采集";
}
}
}
private void btn_GrabImage_Click(object sender, EventArgs e)
{
drawingBoard1.CreatedShapes.Clear();
if (selectBigCam)
{
if (BigCam.CameraMode == CameraMode.Auto)
{
MessageBox.Show("请先切换至手动模式!", "相机采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (btn_ContiGrab.Text == "停止采集")
{
MessageBox.Show("请先停止采集", "采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
BigCam.Grab(false);
}
else
{
if (SmallCam.CameraMode == CameraMode.Auto)
{
MessageBox.Show("请先切换至手动模式!", "相机采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (btn_ContiGrab.Text == "停止采集")
{
MessageBox.Show("请先停止采集", "采集", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
SmallCam.Grab(false);
}
}
private bool selectBigCam = true;
private void showImage()
{
bool first = true;
Bitmap bmp = null;
while (true)
{
if (!BigCam.GrabbedImages.IsEmpty && selectBigCam)
{
BigCam.GrabbedImages.TryDequeue(out bmp);
drawingBoard1.OriginalImage = bmp;
if (first)
{
first = false;
drawingBoard1.Fit2Screen();
}
}
if (!SmallCam.GrabbedImages.IsEmpty && !selectBigCam)
{
SmallCam.GrabbedImages.TryDequeue(out bmp);
drawingBoard2.OriginalImage = bmp;
if (first)
{
first = false;
drawingBoard2.Fit2Screen();
}
}
Thread.Sleep(1);
}
}
private void calculateBig()
{
while(true)
{
if(!serverBig.RcvStrQueue.IsEmpty)
{
string message = "";
lock(serverBig.RcvStrQueue)
{
serverBig.RcvStrQueue.TryDequeue(out message);
}
LogHelper.Info($"收到大视野相机客户端数据: {message}");
switch(message)
{
case "Request_Big_Cam\r\n":
LogHelper.Info("大视野相机拍照");
this.drawingBoard1.Clear();
LogHelper.Info("this.drawingBoard1.Clear()");
BigCam.SetExposureTime(4500);
LogHelper.Info("BigCam.SetExposureTime;");
while (!BigCam.Grab(false))
{
MessageBox.Show("大视野拍照失败!点击确定重拍", "大视野拍照", MessageBoxButtons.OK, MessageBoxIcon.Error);
Thread.Sleep(100);
}
int emptyTimes = 0;
Thread.Sleep(100);
while (BigCam.AutoGrabbedImages.IsEmpty)
{
emptyTimes ;
SetRunLog("BigCam:" emptyTimes "");
Thread.Sleep(100);
if (emptyTimes > 50)
{
SetRunLog("BigCam.AutoGrabbedImages.IsEmpty的while判断异常,直接NG处理。");
break;
}
}
if (!BigCam.AutoGrabbedImages.IsEmpty)
{
Bitmap bmp;
BigCam.AutoGrabbedImages.TryDequeue(out bmp);
LogHelper.Info("BigCam.AutoGrabbedImages.TryDequeue(out bmp);");
bool isPastePositionAlreadyFound;
List<Rectangle2NB> labelRectsCandi;
long time;
VisionAlgrithom.BigSearch(VisionAlgrithom.Bitmap2HObjectBpp32(bmp),
GlobalVariable.CurrentSystemConfig.ReelLowVal, GlobalVariable.CurrentSystemConfig.ReelHighVal,
GlobalVariable.CurrentSystemConfig.BlueLowVal, GlobalVariable.CurrentSystemConfig.BlueHighVal,
GlobalVariable.CurrentSystemConfig.OrangeLowVal, GlobalVariable.CurrentSystemConfig.OrangeHighVal,
GlobalVariable.CurrentSystemConfig.YellowLowVal, GlobalVariable.CurrentSystemConfig.YellowHighVal,
35000, 100000,
128, 150, 180, 100000,
GlobalVariable.CurrentSystemConfig.BarcodeThreshold, GlobalVariable.CurrentSystemConfig.BarcodeWidth, 200, GlobalVariable.CurrentSystemConfig.AngleExtend, GlobalVariable.CurrentSystemConfig.ClosingArea,
out AllPasteRects,
out AllLabelRects,
out labelRectsCandi,
out time);
bmp.Save(@"D:\NGImageBig\" DateTime.Now.ToString("yyyyMMddhhmmssfff") ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
LogHelper.Info("bmp.Save");
//结果显示
this.drawingBoard1.OriginalImage = bmp;
this.drawingBoard2.Fit2Screen();
//是否找到了可贴标区,这几个变量自动运行时没用
IsPasteAreaFound = AllPasteRects != null && AllPasteRects.Count > 0;
if (AllPasteRects != null && AllPasteRects.Count > 0)
{
for (int i = 0; i < AllPasteRects.Count; i )
{
AllPasteRects[i].LineWidth = 2;
AllPasteRects[i].PaintColor2 = Color.Red;
drawingBoard1.CreatedShapes.Add(AllPasteRects[i]);
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
Angle = AllPasteRects[i].Angle,
FontSize = 60,
StartPoint = new PointF((float)AllPasteRects[i].Center.X, (float)AllPasteRects[i].Center.Y),
Text = string.Format("R:{0},C:{1},A:{2}",
AllPasteRects[i].Center.X.ToString("0.00"),
AllPasteRects[i].Center.Y.ToString("0.00"),
(AllPasteRects[i].Angle * 360 / 6.28).ToString("0.00")),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard1.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)AllPasteRects[i].Center.X, (float)AllPasteRects[i].Center.Y)
});
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 280),
Text = string.Format("找到{0}个贴标区,如红色框所示!", AllPasteRects.Count),
PaintColor2 = Color.LimeGreen
});
SetRunLog("找到" AllPasteRects.Count "个贴标区,如红色框所示!");
//如果大视野直接找到了彩色标签 则可直接计算出贴标位置
////为了防止出现手动可以判断出需要覆盖的标签而自动状态获取不到,所做的措施。
//bool isPastePositionAlreadyFoundBackup = false;
////贴标坐标
//PointF pastePositionBackup = new PointF();
////贴标角度
//double pasteAngleBackup = 0;
//if (AllPasteRects != null && AllPasteRects.Count > 0)
//{
// isPastePositionAlreadyFoundBackup = true;
// VisionAlgrithom.CalculatePasteWorldPosition(AllPasteRects[0], @"C:\", GlobalVariable.CurrentSystemConfig.BigAngleOffset, out pastePositionBackup, out pasteAngleBackup);
//}
//else
// isPastePositionAlreadyFoundBackup = false;
}
}
//显示所有的找到的可能有条码的区域
if (AllLabelRects != null && AllLabelRects.Count > 0)
{
for (int i = 0; i < AllLabelRects.Count; i )
{
AllLabelRects[i].LineWidth = 2;
AllLabelRects[i].PaintColor2 = Color.Blue;
drawingBoard1.CreatedShapes.Add(AllLabelRects[i]);
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
Angle = AllLabelRects[i].Angle,
FontSize = 60,
StartPoint = new PointF((float)AllLabelRects[i].Center.X, (float)AllLabelRects[i].Center.Y),
Text = string.Format("R:{0},C:{1},A:{2}",
AllLabelRects[i].Center.X.ToString("0.00"),
AllLabelRects[i].Center.Y.ToString("0.00"),
(AllLabelRects[i].Angle * 360 / 6.28).ToString("0.00")),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard1.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)AllLabelRects[i].Center.X, (float)AllLabelRects[i].Center.Y)
});
}
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 560),
Text = string.Format("找到{0}个读条码区,如蓝色框所示!", AllLabelRects.Count),
PaintColor2 = Color.LimeGreen
});
}
bool showCandiReg = true;
if (showCandiReg)
{
if (labelRectsCandi != null && labelRectsCandi.Count > 0)
{
for (int i = 0; i < labelRectsCandi.Count; i )
{
labelRectsCandi[i].LineWidth = 1;
labelRectsCandi[i].PaintColor2 = Color.Pink;
drawingBoard1.CreatedShapes.Add(labelRectsCandi[i]);
}
}
}
this.drawingBoard1.CreatedShapes.Add(new TextNB()
{
FontSize = 120,
StartPoint = new PointF(20, 730),
Text = string.Format("总耗时: {0} ms", time),
PaintColor2 = Color.White
});
//如果大视野直接找到了彩色标签 则可直接计算出贴标位置
//贴标坐标
PointF pastePosition = new PointF();
//贴标角度
double pasteAngle = 0;
if (AllPasteRects != null && AllPasteRects.Count > 0)
{
isPastePositionAlreadyFound = true;
VisionAlgrithom.CalculatePasteWorldPosition(AllPasteRects[0], @"C:\", GlobalVariable.CurrentSystemConfig.BigAngleOffset, out pastePosition, out pasteAngle);
SetRunLog("isPastePositionAlreadyFound的值为 = " isPastePositionAlreadyFound);
SetRunLog("大视野获取到所需覆盖标签的位置!");
}
else
{
isPastePositionAlreadyFound = false;
SetRunLog("isPastePositionAlreadyFound的值为 = " isPastePositionAlreadyFound);
SetRunLog("大视野没有获取到所需覆盖标签的位置!");
}
List<PointF> labelPositions;
string sendStr;
//通过大视野读取到的可能条码区域 其中第一个为Reel标签区域(如果有的话),计算出小视野XY拍照位置
if (!VisionAlgrithom.CalculateLabelWorldPosition(AllLabelRects, ReelIdRect, @"C:\", out labelPositions))
{
sendStr = "NG;\r\n";
}
else
{
if (labelPositions != null && labelPositions.Count > 0)
{
sendStr = "OK;";
if (isPastePositionAlreadyFound)
{
sendStr = $"{pastePosition.X.ToString("0.00")},{pastePosition.Y.ToString("0.00")},{pasteAngle.ToString("0.00")};";
SetRunLog("大视野获取所需覆盖的标签坐标为 = " $"{pastePosition.X.ToString("0.00")},{pastePosition.Y.ToString("0.00")},{pasteAngle.ToString("0.00")};");
}
else
{
sendStr = "0,0,0;";
SetRunLog("大视野获取所需覆盖的标签坐标为 = " "0,0,0;");
}
foreach (PointF rect in labelPositions)
{
sendStr = $"{rect.X.ToString("0.00")},{rect.Y.ToString("0.00")};";
}
sendStr = "\r\n";
}
else
sendStr = "NG;\r\n";
}
SetRunLog("视觉发送字符串为 = " sendStr);
serverBig.Send(sendStr);
LogHelper.Info($"发送给大视野相机客户端: {sendStr}");
}
else
{
string sendStr = "NG;\r\n";
SetRunLog("大视野发送字符串为 = " sendStr);
SetRunLog("NG原因:BigCam.AutoGrabbedImages.IsEmpty");
serverBig.Send(sendStr);
LogHelper.Info($"发送给大视野相机客户端: {sendStr}");
}
break;
}
}
Thread.Sleep(2);
}
}
private void calculateSmall()
{
while(true)
{
if (!serverSmall.RcvStrQueue.IsEmpty)
{
LogHelper.Info("小视野相机拍照 !serverSmall.RcvStrQueue.IsEmpty");
string message = "";
LogHelper.Info("小视野相机拍照 serverSmall.RcvStrQueue");
lock (serverSmall.RcvStrQueue)
{
serverSmall.RcvStrQueue.TryDequeue(out message);
LogHelper.Info("小视野相机拍照 serverSmall.RcvStrQueue.TryDequeue(out message);");
}
SetRunLog($"收到小视野相机客户端数据: {message}");
LogHelper.Info($"收到小视野相机客户端数据: {message}");
SetRunLog("小视野开始拍照");
string sendStr = "";
if (message.Contains("Request_Small_Cam"))
{
SetRunLog("接收标准请求头Request_Small_Cam");
LogHelper.Info("小视野相机拍照");
this.drawingBoard2.Clear();
SetRunLog("this.drawingBoard2.Clear");
SmallCam.SetExposureTime(500);
while(!SmallCam.Grab(false))
{
MessageBox.Show("小视野拍照失败!点击确定重拍", "小视野拍照", MessageBoxButtons.OK, MessageBoxIcon.Error);
Thread.Sleep(100);
}
Thread.Sleep(100);
int SmallCamEmptyTimes = 0;
while (SmallCam.AutoGrabbedImages.IsEmpty)
{
SmallCamEmptyTimes ;
SetRunLog("SmallCam:" SmallCamEmptyTimes "");
Thread.Sleep(100);
if (SmallCamEmptyTimes > 50)
{
SetRunLog("SmallCam.AutoGrabbedImages.IsEmpty的while判断异常,直接进入NG处理");
break;
}
}
if (!SmallCam.AutoGrabbedImages.IsEmpty)
{
Bitmap bmp;
SmallCam.AutoGrabbedImages.TryDequeue(out bmp);
//小视野典型字符串为:
//Request_Small_Cam;x,y,a;xc,yc,ac;
string[] strs = message.Split(';');
//reel是否已经由大视野相机找到
bool pastealreadyfound = strs[1] != "0,0,0";
List<string> barcodeStr;
List<Rectangle2NB> barcodeRects;
bool isExistReel;
string reel;
VisionAlgrithom.SmallRead(VisionAlgrithom.Bitmap2HObjectBpp32(bmp),
out barcodeStr,
out barcodeRects,
out PasteRect,
out isExistReel,
out reel);
bmp.Save(@"D:\NGImageSmall\" DateTime.Now.ToString("yyyyMMddhhmmssfff") ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
this.drawingBoard2.OriginalImage = bmp;
this.drawingBoard2.Fit2Screen();
if (barcodeRects != null && barcodeRects.Count > 0)
{
for (int i = 0; i < barcodeRects.Count; i )
{
barcodeRects[i].LineWidth = 1;
barcodeRects[i].PaintColor2 = Color.Blue;
drawingBoard2.CreatedShapes.Add(barcodeRects[i]);
this.drawingBoard2.CreatedShapes.Add(new TextNB()
{
FontSize = 45,
StartPoint = new PointF((float)barcodeRects[i].Center.X, (float)barcodeRects[i].Center.Y),
Angle = barcodeRects[i].Angle,
Text = string.Format(barcodeStr[i]),
PaintColor2 = Color.OrangeRed
});
this.drawingBoard2.CreatedShapes.Add(new PointNB()
{
LineWidth = 2,
CrossSize = 30,
Center = new PointF((float)barcodeRects[i].Center.X, (float)barcodeRects[i].Center.Y)
});
}
}
if (PasteRect != null)
{
PasteRect.LineWidth = 2;
PasteRect.PaintColor2 = Color.White;
this.drawingBoard2.CreatedShapes.Add(PasteRect);
}
if (!isExistReel)
{
sendStr = "NG;\r\n";
serverSmall.Send(sendStr);
SetRunLog($"发送小视野相机客户端数据: {sendStr}");
LogHelper.Info($"发送小视野相机客户端数据: {sendStr}");
}
else
{
PointF pastePosition;
double pasteAngle;
if (pastealreadyfound)
sendStr = $"OK;{reel};{strs[1]}\r\n";
else
{
PointF currentSmallHeadWorld = new PointF(Convert.ToSingle(strs[2].Split(',')[0]), Convert.ToSingle(strs[2].Split(',')[1]));
VisionAlgrithom.CalculatePasteWorldPosition2(PasteRect, @"C:\", currentSmallHeadWorld, GlobalVariable.CurrentSystemConfig.SmallAngleOffset, out pastePosition, out pasteAngle);
sendStr = $"OK;{reel};{pastePosition.X.ToString("0.00")},{pastePosition.Y.ToString("0.00")},{pasteAngle.ToString("0.00")};\r\n";
}
serverSmall.Send(sendStr);
SetRunLog($"发送小视野相机客户端数据: {sendStr} , 原因为SmallCam.AutoGrabbedImages.IsEmpty");
LogHelper.Info($"发送小视野相机客户端数据: {sendStr}");
}
}
else
{
sendStr = "NG;\r\n";
serverSmall.Send(sendStr);
SetRunLog($"发送小视野相机客户端数据: {sendStr}");
LogHelper.Info($"发送小视野相机客户端数据: {sendStr}");
}
}
else
{
sendStr = "NG;\r\n";
serverSmall.Send(sendStr);
SetRunLog("请求头不符合要求;此盘NG!");
}
}
Thread.Sleep(2);
}
}
public void showComStatus(string message, string posorneg)
{
this.BeginInvoke(new Action(() =>
{
if(posorneg == "Big")
tSSL_ComStatus.Text = message;
if (posorneg == "Small")
tSSL_ComStatus2.Text = message;
}));
}
//关闭
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
serverBig.Close();
serverSmall.Close();
if (BigCam != null)
{
BigCam.Stop();
BigCam.Close();
}
if (SmallCam != null)
{
SmallCam.Stop();
SmallCam.Close();
}
if (showImageThread != null)
showImageThread.Abort();
if (calculateBigThread != null)
calculateBigThread.Abort();
if (calculateSmallThread != null)
calculateSmallThread.Abort();
}
private void rB_Big_CheckedChanged(object sender, EventArgs e)
{
//if (rB_Big.Checked)
// nUD_Exposure.Value = (decimal)BigCam.GetExposureTime();
}
private void rB_Small_CheckedChanged(object sender, EventArgs e)
{
//if (rB_Small.Checked)
// nUD_Exposure.Value = (decimal)SmallCam.GetExposureTime();
}
private void groupBox5_Enter(object sender, EventArgs e)
{
}
private void btn_SaveImage_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "图像文件(*.bmp)|*.bmp";
if (sfd.ShowDialog() == DialogResult.OK)
{
if(selectBigCam)
this.drawingBoard1.OriginalImage.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
else
this.drawingBoard2.OriginalImage.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
//MessageBox.Show("保存成功!", "保存", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void nUD_Exposure_ValueChanged(object sender, EventArgs e)
{
}
private void btn_SetExposure_Click(object sender, EventArgs e)
{
if (selectBigCam)
{
BigCam.SetExposureTime((float)nUD_Exposure.Value);
}
else
{
SmallCam.SetExposureTime((float)nUD_Exposure.Value);
}
}
private void btn_AddCoordinate_Click(object sender, EventArgs e)
{
if (tC_9Point.SelectedTab == tP_Small)
{
this.dGV_Small9Point.Rows.Add();
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[0].Value = "0.0";
this.dGV_Small9Point.Rows[this.dGV_Small9Point.Rows.Count - 1].Cells[1].Value = "0.0";
}
else if (tC_9Point.SelectedTab == tP_Paste)
{
this.dGV_Paste9Point.Rows.Add();
this.dGV_Paste9Point.Rows[this.dGV_Paste9Point.Rows.Count - 1].Cells[0].Value = "0.0";
this.dGV_Paste9Point.Rows[this.dGV_Paste9Point.Rows.Count - 1].Cells[1].Value = "0.0";
}
else if (tC_9Point.SelectedTab == tP_SmallXY)
{
this.dGV_SmallXY9Point.Rows.Add();
this.dGV_SmallXY9Point.Rows[this.dGV_SmallXY9Point.Rows.Count - 1].Cells[0].Value = "0.0";
this.dGV_SmallXY9Point.Rows[this.dGV_SmallXY9Point.Rows.Count - 1].Cells[1].Value = "0.0";
}
}
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (tC_9Point.SelectedTab == tP_Small && dGV_Small9Point.SelectedRows.Count > 0)
{
dGV_Small9Point.Rows.Remove(dGV_Small9Point.SelectedRows[0]);
}
else if (tC_9Point.SelectedTab == tP_Paste && dGV_Paste9Point.SelectedRows.Count > 0)
{
dGV_Paste9Point.Rows.Remove(dGV_Paste9Point.SelectedRows[0]);
}
else if (tC_9Point.SelectedTab == tP_Big && dGV_BigPixel9Point.SelectedRows.Count > 0)
{
dGV_BigPixel9Point.Rows.Remove(dGV_BigPixel9Point.SelectedRows[0]);
}
}
private void btn_Cali_Click_1(object sender, EventArgs e)
{
if((cB_Cam1.SelectedItem.ToString() == "大视野" ||
cB_Cam2.SelectedItem.ToString() == "大视野" ) &&
dGV_BigPixel9Point.Rows.Count < 6)
{
MessageBox.Show("标定点数不足!请增加标定点或坐标点!");
return;
}
if ((cB_Cam1.SelectedItem.ToString() == "小视野" ||
cB_Cam2.SelectedItem.ToString() == "小视野") &&
dGV_Small9Point.Rows.Count < 6)
{
MessageBox.Show("标定点数不足!请增加标定点或坐标点!");
return;
}
if ((cB_Cam1.SelectedItem.ToString() == "贴标头" ||
cB_Cam2.SelectedItem.ToString() == "贴标头") &&
dGV_Paste9Point.Rows.Count < 6)
{
MessageBox.Show("标定点数不足!请增加标定点或坐标点!");
return;
}
if(cB_Cam1.SelectedItem.ToString() == "大视野" &&
cB_Cam2.SelectedItem.ToString() == "小视野" &&
(dGV_BigPixel9Point.Rows.Count != dGV_Small9Point.Rows.Count))
{
MessageBox.Show("标定点数不相等!");
return;
}
if (cB_Cam1.SelectedItem.ToString() == "小视野" &&
cB_Cam2.SelectedItem.ToString() == "贴标头" &&
(dGV_Paste9Point.Rows.Count != dGV_Small9Point.Rows.Count))
{
MessageBox.Show("标定点数不相等!");
return;
}
//大视野找条码区域,小视野移动过去拍照 两个相机间的标定
if (cB_Cam1.SelectedItem.ToString() == "大视野" &&
cB_Cam2.SelectedItem.ToString() == "小视野")
{
PointF[] crdFrom = new PointF[dGV_BigPixel9Point.Rows.Count];
PointF[] crdTo = new PointF[dGV_BigPixel9Point.Rows.Count];
int index = 0;
foreach(DataGridViewRow dgvr in dGV_BigPixel9Point.Rows)
{
crdFrom[index] = new PointF();
crdFrom[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdFrom[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
index = 0;
foreach (DataGridViewRow dgvr in dGV_Small9Point.Rows)
{
crdTo[index] = new PointF();
crdTo[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdTo[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
VisionAlgrithom.NinePointsCalibrate("Big", "Small", @"C:\", crdFrom, crdTo);
}
//大视野找到彩色标签,直接确定贴标位置
if (cB_Cam1.SelectedItem.ToString() == "大视野" &&
cB_Cam2.SelectedItem.ToString() == "贴标头")
{
PointF[] crdFrom = new PointF[dGV_BigPixel9Point.Rows.Count];
PointF[] crdTo = new PointF[dGV_Paste9Point.Rows.Count];
int index = 0;
foreach (DataGridViewRow dgvr in dGV_BigPixel9Point.Rows)
{
crdFrom[index] = new PointF();
crdFrom[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdFrom[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
index = 0;
foreach (DataGridViewRow dgvr in dGV_Paste9Point.Rows)
{
crdTo[index] = new PointF();
crdTo[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdTo[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
VisionAlgrithom.NinePointsCalibrate("Big", "Paste", @"C:\", crdFrom, crdTo);
}
//小视野XY和贴标头XY之间的标定
if (cB_Cam1.SelectedItem.ToString() == "小视野XY" &&
cB_Cam2.SelectedItem.ToString() == "贴标头")
{
PointF[] crdFrom = new PointF[dGV_SmallXY9Point.Rows.Count];
PointF[] crdTo = new PointF[dGV_SmallXY9Point.Rows.Count];
int index = 0;
foreach (DataGridViewRow dgvr in dGV_SmallXY9Point.Rows)
{
crdFrom[index] = new PointF();
crdFrom[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdFrom[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
index = 0;
foreach (DataGridViewRow dgvr in dGV_Paste9Point.Rows)
{
crdTo[index] = new PointF();
crdTo[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdTo[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
VisionAlgrithom.NinePointsCalibrate("SmallHeader", "Paste", @"C:\", crdFrom, crdTo);
}
//小视野 相机和小视野XY之间的标定
if (cB_Cam1.SelectedItem.ToString() == "小视野" &&
cB_Cam2.SelectedItem.ToString() == "小视野XY")
{
PointF[] crdFrom = new PointF[dGV_SmallXY9Point.Rows.Count];
PointF[] crdTo = new PointF[dGV_SmallXY9Point.Rows.Count];
int index = 0;
foreach (DataGridViewRow dgvr in dGV_Small9Point.Rows)
{
crdFrom[index] = new PointF();
crdFrom[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdFrom[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
index = 0;
foreach (DataGridViewRow dgvr in dGV_SmallXY9Point.Rows)
{
crdTo[index] = new PointF();
crdTo[index].X = (float)Convert.ToDouble(dgvr.Cells[0].Value.ToString());
crdTo[index].Y = (float)Convert.ToDouble(dgvr.Cells[1].Value.ToString());
index ;
}
VisionAlgrithom.NinePointsCalibrate("Small", "SmallHeader", @"C:\", crdFrom, crdTo);
}
}
private void btn_LabelCrd_Click(object sender, EventArgs e)
{
List<PointF> labelPositions;
//通过大视野读取到的可能条码区域 及 Reel区域(如果有的话),计算出小视野XY拍照位置
if (!VisionAlgrithom.CalculateLabelWorldPosition(AllLabelRects, ReelIdRect, @"C:\", out labelPositions))
{
MessageBox.Show("找不到可以读码的区域!", "位置", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
//PointF point = new PointF();
//VisionAlgrithom.ConvertCoordinate("Big", "Small", @"C:\", new PointF(1633f, 2849F), out point);
if (labelPositions != null && labelPositions.Count > 0)
{
string str = "";
foreach (PointF p in labelPositions)
{
str = p.X.ToString("0.00") "," p.Y.ToString("0.00") "\n";
}
MessageBox.Show(str, "位置", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btn_BarCrd_Click(object sender, EventArgs e)
{
if(PasteRectOld == null && PasteRect == null)
{
MessageBox.Show("请先进行读码!", "贴标坐标", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
PointF pastePosition = new PointF();
double pasteAngle = 0;
if (PasteRectOld != null)
VisionAlgrithom.CalculatePasteWorldPosition(PasteRectOld, @"C:\", GlobalVariable.CurrentSystemConfig.BigAngleOffset, out pastePosition, out pasteAngle);
else if (PasteRect != null)
VisionAlgrithom.CalculatePasteWorldPosition2(PasteRect, @"C:\", new PointF(95.91f,92.78f), GlobalVariable.CurrentSystemConfig.SmallAngleOffset, out pastePosition, out pasteAngle);
PasteRectOld = null;
PasteRect = null;
string str = pastePosition.X.ToString("0.00") "," pastePosition.Y.ToString("0.00") "," pasteAngle.ToString("0.00") "\n";
MessageBox.Show(str, "位置", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btn_SetBigParam_Click(object sender, EventArgs e)
{
FormBigParam bigParam = new FormBigParam(GlobalVariable.CurrentSystemConfig.ReelHighVal,
GlobalVariable.CurrentSystemConfig.ReelLowVal,
GlobalVariable.CurrentSystemConfig.BlueHighVal,
GlobalVariable.CurrentSystemConfig.BlueLowVal,
GlobalVariable.CurrentSystemConfig.OrangeHighVal,
GlobalVariable.CurrentSystemConfig.OrangeLowVal,
GlobalVariable.CurrentSystemConfig.YellowHighVal,
GlobalVariable.CurrentSystemConfig.YellowLowVal,
GlobalVariable.CurrentSystemConfig.BarcodeThreshold,
GlobalVariable.CurrentSystemConfig.BarcodeWidth,
GlobalVariable.CurrentSystemConfig.AngleExtend,
GlobalVariable.CurrentSystemConfig.ClosingArea);
if(bigParam.ShowDialog() == DialogResult.OK)
{
GlobalVariable.CurrentSystemConfig.ReelHighVal = bigParam.ReelHighVal;
GlobalVariable.CurrentSystemConfig.ReelLowVal = bigParam.ReelLowVal;
GlobalVariable.CurrentSystemConfig.BlueHighVal = bigParam.BlueHighVal;
GlobalVariable.CurrentSystemConfig.BlueLowVal = bigParam.BlueLowVal;
GlobalVariable.CurrentSystemConfig.OrangeHighVal = bigParam.OrangeHighVal;
GlobalVariable.CurrentSystemConfig.OrangeLowVal = bigParam.OrangeLowVal;
GlobalVariable.CurrentSystemConfig.YellowHighVal = bigParam.YellowHighVal;
GlobalVariable.CurrentSystemConfig.YellowLowVal = bigParam.YellowLowVal;
GlobalVariable.CurrentSystemConfig.BarcodeThreshold = bigParam.BarcodeThreshold;
GlobalVariable.CurrentSystemConfig.BarcodeWidth = bigParam.BarcodeWidth;
GlobalVariable.CurrentSystemConfig.AngleExtend = bigParam.AngleExtend;
GlobalVariable.CurrentSystemConfig.ClosingArea = bigParam.ClosingArea;
SystemConfig.Save(@"C:\\test.xml", GlobalVariable.CurrentSystemConfig);
}
}
private void button1_Click(object sender, EventArgs e)
{
drawingBoard1.DrawRectangle2 = true;
}
private void tSSL_Auto_MouseDown(object sender, MouseEventArgs e)
{
if(tSSL_Auto.Text == "自动运行中")
{
tSSL_Auto.BorderStyle = Border3DStyle.Raised;
tSSL_Auto.Text = "手动运行中";
tSSL_Auto.BackColor = Color.Yellow;
}
else
{
tSSL_Auto.BorderStyle = Border3DStyle.Sunken;
tSSL_Auto.Text = "自动运行中";
tSSL_Auto.BackColor = Color.LimeGreen;
}
}
private void btn_LoadCali_Click(object sender, EventArgs e)
{
}
private void cB_Rectangle_CheckedChanged(object sender, EventArgs e)
{
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
BigCam.CameraMode = CameraMode.Manual;
SmallCam.CameraMode = CameraMode.Manual;
}
else
{
BigCam.CameraMode = CameraMode.Auto;
SmallCam.CameraMode = CameraMode.Auto;
}
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl1.SelectedTab == tabPage1)
selectBigCam = true;
else
selectBigCam = false;
}
private void button1_Click_1(object sender, EventArgs e)
{
if (cB_Cam1.SelectedIndex == -1)
return;
if (cB_Cam2.SelectedIndex == -1)
return;
PointF srcPoint = new PointF(Convert.ToSingle(textBox1.Text), Convert.ToSingle(textBox2.Text));
PointF dstPoint = new PointF();
string convertFrom = "";
string convertTo = "";
if (cB_Cam1.Text == "小视野")
convertFrom = "Small";
else if (cB_Cam1.Text == "小视野XY")
convertFrom = "SmallHeader";
if (cB_Cam2.Text == "小视野XY")
convertTo = "SmallHeader";
else if(cB_Cam2.Text == "贴标头")
convertTo = "Paste";
VisionAlgrithom.ConvertCoordinate(convertFrom, convertTo, @"C:\", srcPoint, out dstPoint);
PointF centerPoint = new PointF(1032f, 1544f);
PointF centerWorldPoint = new PointF();
VisionAlgrithom.ConvertCoordinate(convertFrom, convertTo, @"C:\", centerPoint, out centerWorldPoint);
float dx = centerWorldPoint.X - dstPoint.X Convert.ToSingle(textBox4.Text);
float dy = centerWorldPoint.Y - dstPoint.Y Convert.ToSingle(textBox3.Text);
//PointF markPoint = new PointF(dstPoint.X dx, dstPoint.Y dy);
//PointF finalPoint = new PointF(dstPoint.X )
MessageBox.Show($"{dx},{dy}");
}
private void button2_Click(object sender, EventArgs e)
{
serverSmall.Send("hello world");
}
private void nUD_BigAngleOffset_ValueChanged(object sender, EventArgs e)
{
GlobalVariable.CurrentSystemConfig.BigAngleOffset = (double)nUD_BigAngleOffset.Value;
SystemConfig.Save(@"C:\\test.xml", GlobalVariable.CurrentSystemConfig);
}
private void nUD_SmallAngleOffset_ValueChanged(object sender, EventArgs e)
{
GlobalVariable.CurrentSystemConfig.SmallAngleOffset = (double)nUD_SmallAngleOffset.Value;
SystemConfig.Save(@"C:\\test.xml", GlobalVariable.CurrentSystemConfig);
}
#region 显示运行记录
private void SetRunLog(string mRunTest)
{
//pLog.WriteLog(mRunTest, "RunLog");
SetRichTextFunction(rTB_SysInfo, mRunTest, Color.Green, "RunLog");
Thread.Sleep(20);
}
private void SetRichTextFunction(RichTextBox pButton, string mStr, Color pColor, string iType)
{
if (pButton == null)
{
throw new ArgumentNullException(nameof(pButton));
}
if (pButton.InvokeRequired)
{
SetRichTextSN ss = new SetRichTextSN(SetRichTextFunction);
BeginInvoke(ss, new object[] { pButton, mStr, pColor, iType });
}
else
{
if (pButton.TextLength >= 65530)
{
pButton.Text = string.Empty;
}
pButton.AppendText(DateTime.Now.ToString("HH:mm:ss ") mStr System.Environment.NewLine);
if (pButton.Text.LastIndexOf(mStr) >= 0 && mStr.Length > 0)
{
pButton.Select(pButton.Text.LastIndexOf(mStr), mStr.Length);
pButton.SelectionColor = pColor;
pButton.SelectionLength = mStr.Length;
}
pButton.ScrollToCaret();
pLog.WriteLog(mStr, iType);
}
}
#endregion
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论