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

【机械视觉】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;
    }


}

相关文章:

  • [Web]ServletContext域(Application)
  • 【Agent】Windows 和 CentOS 安装 Conda
  • wireguard搭配udp2raw部署内网
  • 坐落于杭州的电商代运营公司品融电商
  • 智能验证码破解:突破reCAPTCHA、Cloudflare和hCaptcha的全方位解决方案
  • selenium的鼠标操作
  • 每天一道算法题【蓝桥杯】【x的平方根】
  • 通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元
  • Qt5.10版本以下 qml ui语言动态切换
  • MySQL EXPLAIN 详解
  • 网络安全linux命令
  • CAAC无人机考证备考清单
  • 《用 python、MySQL 和 Chart.js 打造炫酷数据看板》实战案例笔记
  • SQLiteStudio:一款免费开源跨平台的SQLite管理工具
  • Kerckhoffs原理
  • 磁盘和文件系统
  • 【商城实战(23)】筑牢安全防线,防范常见漏洞
  • 【系统架构设计师】测试方法
  • 【Java项目】基于JSP的二手手机回收系统
  • Stable Diffusion 模型文件 .ckpt 与 .safetensors 的区别
  • 美国失去最后一个AAA评级,资产价格怎么走?美股或将触及天花板
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 收到延期付款利息,该缴纳增值税吗?
  • 上海率先推进生物制品分段生产试点,这款国产1类创新药获批上市
  • 夜读丨母亲为燕子打开家门
  • 经济日报评外卖平台被约谈:行业竞争不能背离服务本质