C#联合编程(网格检测)
1、界面搭建
搭建主页面和算法编辑页面,并选择控件。
2、代码编辑
主界面代码
using Cognex.VisionPro; using Cognex.VisionPro.Display; using Cognex.VisionPro.ImageFile; using Cognex.VisionPro.Implementation; using Cognex.VisionPro.ToolBlock; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _0623联合一环境搭建 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //设置图像打开的方式 cogDisplay1.AutoFit = true; cogDisplay1.MouseWheelMode = Cognex.VisionPro.Display.CogDisplayMouseWheelModeConstants.Zoom1; if (File.Exists("默认.vpp"))//默认算法加载 { try { ctb = CogSerializer.LoadObjectFromFile("默认.vpp") as CogToolBlock; } catch { } } if (File.Exists("默认.png")) { using (CogImageFileTool cift = new CogImageFileTool()) { cift.Operator.Open("默认.png", CogImageFileModeConstants.Read); cift.Run(); ICogImage ici = cift.OutputImage; //2、将图片显示到DisPlay上 cogDisplay1.Image = ici; } } if (File.Exists("Json数据统计.txt")) { string path = Directory.GetCurrentDirectory() + "\\Json数据统计.txt";//指定路径 string str; using (StreamReader sr = new StreamReader(path)) { str = sr.ReadToEnd(); } JArray JA = JArray.Parse(str); textBox1.Text = Convert.ToString(JA[0]); comboBox1.Text = Convert.ToString(JA[1]); } } private void 打开图像ToolStripMenuItem_Click(object sender, EventArgs e) { try { //实例化打开文件工具 using (OpenFileDialog ofd = new OpenFileDialog())//使用using关闭对话框会释放资源 { //设置默认路径 ofd.InitialDirectory = "F:\\VisionPro\\xiangmu"; //规定文件后缀格式 ofd.Filter = "图片文件|*.jpg;*.png;*.bmp;|所有文件|*.*"; //ofd.ShowDialog()是一个有返回值的方法 //使用同类型的变量接收返回值 DialogResult dr = ofd.ShowDialog(); //如果没有正常打开 if (dr != DialogResult.OK) return; //定义一个字符串。接收文件路径 string filepath = ofd.FileName; File.Copy(filepath,"默认.png",true); //将图像显示道DisPlay //1、根据路径找到图片 //方法一: using (CogImageFileTool cift = new CogImageFileTool()) { cift.Operator.Open(filepath, CogImageFileModeConstants.Read); cift.Run(); ICogImage ici = cift.OutputImage; //2、将图片显示到DisPlay上 cogDisplay1.Image = ici; } //方法二: //CogImageFile cif = new CogImageFile(); //cif.Open(filepath, CogImageFileModeConstants.Read); //ICogImage ici = cif[0]; //2、将图片显示到DisPlay上 //cogDisplay1.Image = ici; } } catch { MessageBox.Show("打开文件格式错误,请联系管理员"); } SuanfaYunXing(); } CogToolBlock ctb = null; private void 加载算法ToolStripMenuItem_Click(object sender, EventArgs e) { //实例化打开文件工具 using (OpenFileDialog ofd = new OpenFileDialog())//使用using关闭对话框会释放资源 { //规定文件后缀格式 ofd.Filter = "算法文件|*.vpp;"; //设置默认路径 ofd.InitialDirectory = "F:\\VisionPro\\xiangmu"; DialogResult dr = ofd.ShowDialog(); //如果没有正常打开 if (dr != DialogResult.OK) return; //定义一个字符串。接收文件路径 string filepath = ofd.FileName; try { //序列化在保存文件时已经完成了 //现在只需要反序列化将文件拿来用 ctb= CogSerializer.LoadObjectFromFile(filepath) as CogToolBlock; } catch { MessageBox.Show("打开算法文件格式错误,请联系管理员"); } } } private void SuanfaYunXing()//算法运行的方法 { //运行前需要将输入图像全部传入再去运行 if (cogDisplay1.Image == null) { MessageBox.Show("先传图"); return; } if (ctb == null) { MessageBox.Show("先传算法文件"); return; } ctb.Inputs["OutputImage"].Value = cogDisplay1.Image; ctb.Inputs["Color"].Value = comboBox1.SelectedIndex; ctb.Inputs["MinArea"].Value = Convert.ToInt32(textBox1.Text); ctb.Run(); //显示结果 ICogRecord record = ctb.CreateLastRunRecord(); cogDisplay1.Record = record; int i = ctb.CreateLastRunRecord().SubRecords.IndexOfKey("CogBlobTool1.InputImage"); record = ctb.CreateLastRunRecord().SubRecords[i]; cogDisplay1.Record = record; label3.Text = Convert.ToString(ctb.Outputs["Result"].Value);//修改OK和NG label3.ForeColor = (label3.Text == "OK") ? Color.Green : Color.Red; } private void button1_Click(object sender, EventArgs e) { SuanfaYunXing(); JArray JA = new JArray(); JA.Add(textBox1.Text); JA.Add(comboBox1.Text); string str = JA.ToString(); string path = Directory.GetCurrentDirectory() + "\\Json数据统计.txt"; using (StreamWriter sw = new StreamWriter(path, false)) { sw.WriteLine(str); } } private void 编辑算法ToolStripMenuItem_Click(object sender, EventArgs e) { SuanfaYunXing(); using (EditSF SF = new EditSF(ctb)) { SF.GetNewSF = (Newctb) => { ctb = Newctb; }; SF.ShowDialog(); SF.GetNewSF = null;//释放委托 } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)//颜色选择框更改时直接同步更改图像上的颜色 { SuanfaYunXing(); } private void button2_Click(object sender, EventArgs e) { //1.获取图像 //ICogImage img=cogDisplay1.Image; Image img = cogDisplay1.CreateContentBitmap(CogDisplayContentBitmapConstants.Image); //2.保存图像 string FileName = DateTime.Now.ToString("yyyyMMddHHmmssFFF") + ".png";//使用时间来为文件命名 string ImagePath = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}"; Directory.CreateDirectory(ImagePath); ImagePath = Path.Combine(ImagePath ,FileName);//拼接路径 img.Save(ImagePath, ImageFormat.Png); MessageBox.Show("图像保存成功"); } } }算法编辑界面代码
using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _0623联合一环境搭建 { public partial class EditSF : Form { private EditSF() { InitializeComponent(); } //定义字段用来保存参数 CogToolBlock ctb = null; //重载接收数据窗体的构造函数 public EditSF(CogToolBlock ctb):this() { this.ctb = ctb; cogToolBlockEditV21.Subject=this.ctb; } //声明一个委托 public Action<CogToolBlock> GetNewSF; private void EditSF_FormClosing(object sender, FormClosingEventArgs e) { CogToolBlock ctb = cogToolBlockEditV21.Subject; if (ctb == null) return; string debug = Directory.GetCurrentDirectory(); string ctbPath = Path.Combine(debug, "默认.vpp"); CogSerializer.SaveObjectToFile(ctb, ctbPath); if (GetNewSF!=null) { GetNewSF?.Invoke(ctb); } } } }