主要完成了点击按钮,进行图像检测的功能并且含有检测目标计数功能,包含两种显示,单次显示以及连续显示,如下图所示:

        首先需要进入VisionPro QuickBuild里面新建一个工程文件vpp,完成对应的操作,当然也可以直接从安装路径下的samples里面寻找一个对应的实列即可,本文的示例为samples中的示例,如下图所示:

1、创建vpp文件之后,打开vs,创建一个Windows窗口应用,开始进行窗口控件的放置。

2、在引用工程目录下的引用的地方,引入VisionPro的一些动态链接库,并且在代码中引用Cognex.VisionPro以及Cognex.VisionPro.QuickBuild。

3、初始化VisionPro中的变量。

        //需要声明的3个变量
        CogJobManager myjobManager;           //对应vpp中的工程
        CogJob myjob;                         //对应工程文件中的某一项工作
        CogJobIndependent myjobIndependent;   //
        //委托
        delegate void UserResultDelegate(object sender, CogJobManagerActionEventArgs e);        

        private void InitializeCogjob()
        {
            //加载vpp文件
            string address = "./test.vpp" 
            myjobManager =(CogJobManager)CogSerializer.LoadObjectFromFile(address);
            //设置myjob的序列号
            myjob = myjobManager.Job(0);
            myjobIndependent = myjob.OwnedIndependent;


            //一个应用程序是由多个线程组成的,需要对线程中的队列进行刷新
            myjobManager.FailureQueueFlush();       //失败队列刷新
            myjobManager.UserQueueFlush();          //用户队列刷新
            myjob.ImageQueueFlush();                //图像队列刷新
            myjobIndependent.RealTimeQueueFlush();  //实时队列刷新

            //结果处理
            myjobManager.UserResultAvailable += MyjobManager_UserResultAvailable;
        }
        //构造函数
        public Form1()
        {
            InitializeComponent();  //主要是一些基础控件的初始化
            InitializeCogjob();     //VisionPro中的变量的声明和初始化
        }

4、开始对Form中控件的行为进行编程,双击控件,即可跳转到对应的代码部分;

        4.1、单次点击控件按钮,点击一次运行一次,附带图像显示代码,代码如下:

        private void MyjobManager_UserResultAvailable(
        object sender, CogJobManagerActionEventArgs e)
        {
            //控件操作都位于主线程,为了解决跨线程操作控件的问题,使用控件
            //属性InvokeRequired 如果是true的话,就需要解决这个问题。
            //使用委托函数进行操作
            if(InvokeRequired)  
            {
              BeginInvoke(new UserResultDelegate(
              MyjobManager_UserResultAvailable), new object[] { sender, e });
                return;
            }
            //MessageBox.Show("start");
            //开始处理数据
            ICogRecord tmp;
            ICogRecord mydata =  myjobManager.UserResult();
            //找到vpp程序中的已发送项目的地址,通过SubRecords得到对应的数据
            tmp = mydata.SubRecords[
            @"Tools.Item[""CogBlobTool1""].CogBlobTool.Results.GetBlobs().Count"];
            int Count = (int)tmp.Content;
            mytextBox.Text = Count.ToString();
            //开始图像的显示
            tmp = mydata.SubRecords["ShowLastRunRecordForUserQueue"];
            tmp = tmp.SubRecords["LastRun"];
            tmp = tmp.SubRecords["Image Source.OutputImage"];
            cogRecordDisplay1.Record = tmp;
            cogRecordDisplay1.Fit(true);  //自适应控件中窗口的大小。
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                myjobManager.Run();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        4.2、点击连续工作按钮,会一直工作,并且单次点击按钮编程不可点击模式,代码如下:

       private void checkBox1_CheckedChanged(object sender, EventArgs e)
       {
           //按键按下
           if (checkBox1.Checked)
           {
               try
               {
                   myjobManager.RunContinuous();
               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);
                   
               }
               mybutton.Enabled = false;

           }
           else
           {
               try
               {
                   myjobManager.Stop();
               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);
               }
               mybutton.Enabled = true;
           }

       }

5、对于项目结束运行后,需要点击窗口的关闭按钮,此时需要对线程进行关闭,资源进行回收,代码如下:

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //需要解除委托
            myjobManager.UserResultAvailable -= new CogJobManager.CogUserResultAvailableEventHandler(MyjobManager_UserResultAvailable);
            cogRecordDisplay1.Dispose();
            // Be sure to shudown the CogJobManager!!
            myjobManager.Shutdown();
        }

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐