当前位置: 首页 > article >正文

【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】

【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】

项目介绍

总共有十二张检测的图片,当点击检测按钮时检测当前展示的图片并且将检测效果展示在表格中,当点击上一页或下一页时换检测图片,点击保存本地时通过csv文件格式将表格数据保存,当下一次运行时将数据读取出来并且展示在表格中。

此项目通过异步进行优化,在加载时改变了以往卡顿的情况,加载变得流畅。

此项目检测时的逻辑代码是在visionPro中完成的。

所用的控件:

  • cogRecordDisplay
  • dataGridView
  • button
  • label

实现项目

第一步、创建toolblock工具,并且在其中训练检测工具。(并且保存)

三个匹配工具分别匹配一元一角五角,然后将匹配数量赋值给结果分析工具,通过结果分析工具计算出总和。

其中用到了结果分析工具(CogResultsAnalysisTool1),一下是构造:

第二步、创建winform项目,并且搭建界面:

第三步、编写代码:(以下是源码)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    CogToolBlock tb = new CogToolBlock(); 
    int numPage = 1; // 图片页数
    string fileName = "./硬币/"; // 路径

    /// <summary>
    /// 加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_Load(object sender, EventArgs e)
    {
        Task.Run(() =>
        {
            tb = (CogToolBlock)CogSerializer.LoadObjectFromFile("./硬币检测.vpp");
        });
        this.Invoke(new Action(() => {
            ConvertImage();
            this.labelPageMaxNum.Text = "最大页数为: 12";
            string[][] strings = csvSave("./data.csv");
            if (strings!=null)
            {
                for (int i = 1; i < strings.Length; i++)
                {
                    this.dataGridView1.Rows.Add(strings[i]);
                }
            }
        }));
    }
    /// <summary>
    /// 检测
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonDetection_Click(object sender, EventArgs e)
    {
        tb.Inputs["OutputImage"].Value = this.cogRecordDisplay1.Image;
        tb.Run();
        this.cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0];
         CogPMAlignTool pma1 = tb.Tools[1] as CogPMAlignTool;
         CogPMAlignTool pma2 = tb.Tools[2] as CogPMAlignTool;
         CogPMAlignTool pma3 = tb.Tools[3] as CogPMAlignTool;
        this.dataGridView1.Rows.Add(new string[] { DateTime.Now.ToString(), "凹凸曼", pma1.Results.Count.ToString(),pma2.Results.Count.ToString(),pma3.Results.Count.ToString(), tb.Outputs["YuanCount"].Value.ToString() });
    }

    /// <summary>
    /// 上一页
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonTopPage_Click(object sender, EventArgs e)
    {
        if (numPage>1)
        {
            numPage -= 1;
            ConvertImage();
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("当前为第一页");
        }
    }

    /// <summary>
    /// 下一页
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonBottomPage_Click(object sender, EventArgs e)
    {
        if (numPage < 12)
        {
            numPage += 1;
            ConvertImage();
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("当前为最后一页");
        }
    }

    /// <summary>
    /// 换图片
    /// </summary>
    private void ConvertImage()
    {
        Bitmap bitmap = new Bitmap(fileName + numPage + ".bmp");
        this.cogRecordDisplay1.Image = new CogImage24PlanarColor(bitmap);
        this.cogRecordDisplay1.Fit();
        this.labelPageShow.Text = $"第{numPage}页";
    }

    /// <summary>
    /// 保存本地
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonSave_Click(object sender, EventArgs e)
    {
        if(this.dataGridView1.Rows.Count < 1){
            System.Windows.Forms.MessageBox.Show("没有数据");
            return;
        }
        using (FileStream fs = new FileStream("./data.csv", FileMode.Create))
        using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
        {
            sw.WriteLine("测量时间,管理员,一元个数,一角个数,五角个数,总和");
            for (int i = 0;i<this.dataGridView1.Rows.Count;i++)
            {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < this.dataGridView1.Columns.Count; j++)
                {
                    if(j== this.dataGridView1.Columns.Count-1) sb.Append(this.dataGridView1.Rows[i].Cells[j].Value);
                    else sb.Append(this.dataGridView1.Rows[i].Cells[j].Value+",");
                }
                sw.WriteLine(sb.ToString());
            }
            System.Windows.Forms.MessageBox.Show("保存成功");            }
    }

    private string[][] csvSave(string filename)
    {
        try
        {
            using (StreamReader sr = new StreamReader(filename, Encoding.UTF8))
            {
                string strVal = sr.ReadToEnd().Trim();
                string[] vals = strVal.Split('\n');
                string[][] lines = new string[vals.Length][];
                for (int i = 0; i < vals.Length; i++)
                {
                    lines[i] = vals[i].Split(',');
                }
                return lines;
            }
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
        return null;
    }


}


http://www.kler.cn/a/582035.html

相关文章:

  • Vue主流的状态保存框架对比
  • git无法提交解决方案--! [rejected] master -> master (non-fast-forward)
  • WLAN(无线局域网)安全
  • 《PyCharm 重命名项目文件时遇到 java.io.IOException 的终极解决方案》
  • [java]增强for循环
  • 误删/lib64/ld-linux-x86-64.so.2导致系统崩溃
  • php中JSON或数组到formData的键值对转换
  • Qt的Tcp通信
  • mysql的MGR
  • 基于生成式人工智能的网络安全主动防御技术(下)
  • C++ 编程基础:注释、字符串、输入输出、日期处理、修饰符
  • 2025最新软件测试面试八股文(含答案+文档)
  • CSS伸缩盒模型(弹性盒子)
  • 01 音视频知识学习(视频)
  • 写一个简单的SQL生成工具
  • 算法刷题--贪心算法
  • Sentinel-1 InSAR ISCE数据处理:stackSentinel.py 完全指南
  • python LLM工具包
  • API调试工具的无解困境:白名单、动态IP与平台设计问题
  • Faster R-CNN原理详解以及Pytorch实现模型训练与推理