VisionPro二次开发——C#计算旋转中心

本文将通过Visual Studio 2019运行VisionPro软件计算旋转中心,可用于旋转标定。


目录

前期准备

程序框架

引用内容

窗体设计

程序设计

运行结果


前期准备

首次在Visual Studio进行二次开发时,工具箱中不包含VisionPro中工具的控件,需要手动添加控件到工具箱中,具体参考VisionPro二次开发——C#显示卡尺极性 。


程序框架

MainForm窗体为主窗体,ToolBlockForm窗体用于显示工具块VPP,FitCircleToolForm用于显示拟合圆工具的结果。


引用内容

使用VisionPro软件中封装的工具必须添加对应的引用才能添加对应的命名空间,具体操作如下:

点击添加引用后选择以下引用:

<不推荐将全部与VisionPro相关的引用都添加,这样会造成程序占用空间非常的大>

<最好的方法是需要一个添加一个>


窗体设计

1.MainForm主窗体

其中cogRecordDisplay控件用于显示拟合圆的结果图像,TabelLayoutPanel控件用于调整窗体控件的布局,具体可看C#控件自适应布局。

2.ToolBlockForm工具块窗体

 其中cogToolBlockEdit控件用于显示ToolBlock工具,并可以编辑,运行,保存等。

3.FitCircleToolForm拟合圆工具窗体

 

  其中cogToolBlockEdit控件用于显示FitCircle工具,并可以设置,查看结果,运行等。


程序设计 

1.MainForm窗体代码

1.1思路解析

Step1 点击编辑图像按键后,打开选择图像窗体,并将图像路径存储

/* 当点击编辑图像按键时运行 */
        private void btnPicture_Click(object sender, EventArgs e)
        {
            /* using完后空间会被释放 */
            using (OpenFileDialog ofd = new OpenFileDialog())  //ofd类
            {
                ofd.Title = "编辑图像";  //窗口名
                ofd.InitialDirectory = @"D:\"; //打开的路径
                ofd.Multiselect = true;  //是否允许多选
                ofd.Filter = "图像文件|*.JPG"; //支持的文件格式
                ofd.ShowDialog();  //打开选择窗口
                picPath = ofd.FileNames;  //将图片路径保存到数组中
            }
        }

Step2 点击编辑VPP按键后,打开ToolBlockForm窗体

/* 当点击编辑VPP按键时运行 */
        private void btnSettingVPP_Click(object sender, EventArgs e)
        {
            ToolBlockForm toolBlockForm = new ToolBlockForm(mToolBlock);
            toolBlockForm.ShowDialog();  //打开ToolBlockForm窗体
        }

Step3 点击运行VPP按键后,将每次ToolBlock定位的点传入到FitCircleTool中,利用这些点拟合出圆,并将圆心即旋转中心的坐标显示到MainForm主窗体中

/* 当点击运行VPP按键时运行 */
        private void btnRunVPP_Click(object sender, EventArgs e)
        {
            mFitCircle.RunParams.NumPoints = picPath.Length;  //拟合圆的点数
            Point[] point = new Point[picPath.Length];
            /* 方法一:拟合圆工具计算旋转中心 */
            for (int pointIndex = 0; pointIndex < mFitCircle.RunParams.NumPoints; pointIndex++)
            {
                mImageFileTool.Operator.Open(picPath[pointIndex], CogImageFileModeConstants.Read);  //利用图像文件工具打开文件夹中的图像
                /// 参数1:图像路径,参数2:运行模式
                mImageFileTool.Run();  //运行图像文件工具
                mToolBlock.Inputs["Image"].Value = mImageFileTool.OutputImage;  //给工具块输入图像
                mToolBlock.Run();  //运行工具块
                mFitCircle.RunParams.SetPoint(pointIndex, (double)mToolBlock.Outputs["JiPianX"].Value, (double)mToolBlock.Outputs["JiPianY"].Value);  //将工具块输出的点输入到拟合圆工具中
                /// 参数1:第几个点,参数2:点的横坐标,参数3:点纵坐标
                point[pointIndex].x = (double)mToolBlock.Outputs["JiPianX"].Value;
                point[pointIndex].y = (double)mToolBlock.Outputs["JiPianY"].Value;
            }
            mFitCircle.InputImage = mImageFileTool.OutputImage;  //将图像文件工具的最后一张输入到拟合圆工具中
            mFitCircle.Run();  //运行拟合圆工具
            /* 方法二:两点一角度计算旋转中心 */
            //Point centerPoint = new Point();
            //centerPoint = calCenter(point[0], point[1], 2.5);
            cogRecordDisplay.Record = mFitCircle.CreateLastRunRecord().SubRecords["InputImage"];  //显示拟合圆工具的结果图像
            fitXTextBox.Text = mFitCircle.Result.GetCircle().CenterX.ToString("F");  //显示利用拟合圆工具确定的旋转中心的横坐标X
            fitYTextBox.Text = mFitCircle.Result.GetCircle().CenterY.ToString("F");  //显示利用拟合圆工具确定的旋转中心的纵坐标Y
        }

<除了用FitCircle工具计算旋转中心以外可以用数学的方法计算旋转中心>

mFitCircle.RunParams.SetPoint(pointIndex, (double)mToolBlock.Outputs["JiPianX"].Value, (double)mToolBlock.Outputs["JiPianY"].Value);  //将工具块输出的点输入到拟合圆工具中

其中利用YourToolBlock.Outputs["XXX"].Value来获取工具块的结果,工具块VPP设计如下,利用模板工具和定位工具定位特征,利用找线工具和交点工具获取点坐标,设计如下图所示:

Step4 点击查看标定按键后,打开FitCircleForm窗体

/* 当点击查看标定按键时运行 */
        private void btnCheckCalib_Click(object sender, EventArgs e)
        {
            FitCircleToolForm fitCircleToolForm = new FitCircleToolForm(mFitCircle);
            fitCircleToolForm.ShowDialog();  //打开FitCircleToolForm窗体
        }

 1.2源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.Caliper;

namespace CenterCalib
{
    public partial class MainForm : Form
    {
        /* 定义变量 */
        public static string vppPath = "D:\\Code\\visionpro\\CenterCalib\\bin\\Debug\\CenterCalib.vpp";  //VPP保存路径
        public string[] picPath = null;  //数组保存图片路径
        private static double theath = 1;  //角度制
        CogToolBlock mToolBlock = CogSerializer.LoadObjectFromFile(vppPath) as CogToolBlock;  //实例化工具块
        CogImageFileTool mImageFileTool = new CogImageFileTool();  //实例化图像文件工具
        CogFitCircleTool mFitCircle = new CogFitCircleTool();  //实例化拟合圆工具
        struct Point  //定义结构体: 点
        {
            public double x;
            public double y;
            public Point(double _x,double _y)  //有参构造函数
            {
                x = _x;
                y = _y;
            }
        }
        public MainForm()
        {
            InitializeComponent();
        }
        /* 当点击编辑图像按键时运行 */
        private void btnPicture_Click(object sender, EventArgs e)
        {
            /* using完后空间会被释放 */
            using (OpenFileDialog ofd = new OpenFileDialog())  //ofd类
            {
                ofd.Title = "编辑图像";  //窗口名
                ofd.InitialDirectory = @"D:\"; //打开的路径
                ofd.Multiselect = true;  //是否允许多选
                ofd.Filter = "图像文件|*.JPG"; //支持的文件格式
                ofd.ShowDialog();  //打开选择窗口
                picPath = ofd.FileNames;  //将图片路径保存到数组中
            }
        }
        /* 当点击编辑VPP按键时运行 */
        private void btnSettingVPP_Click(object sender, EventArgs e)
        {
            ToolBlockForm toolBlockForm = new ToolBlockForm(mToolBlock);
            toolBlockForm.ShowDialog();  //打开ToolBlockForm窗体
        }
        /* 当点击运行VPP按键时运行 */
        private void btnRunVPP_Click(object sender, EventArgs e)
        {
            mFitCircle.RunParams.NumPoints = picPath.Length;  //拟合圆的点数
            Point[] point = new Point[picPath.Length];
            /* 方法一:拟合圆工具计算旋转中心 */
            for (int pointIndex = 0; pointIndex < mFitCircle.RunParams.NumPoints; pointIndex++)
            {
                mImageFileTool.Operator.Open(picPath[pointIndex], CogImageFileModeConstants.Read);  //利用图像文件工具打开文件夹中的图像
                /// 参数1:图像路径,参数2:运行模式
                mImageFileTool.Run();  //运行图像文件工具
                mToolBlock.Inputs["Image"].Value = mImageFileTool.OutputImage;  //给工具块输入图像
                mToolBlock.Run();  //运行工具块
                mFitCircle.RunParams.SetPoint(pointIndex, (double)mToolBlock.Outputs["JiPianX"].Value, (double)mToolBlock.Outputs["JiPianY"].Value);  //将工具块输出的点输入到拟合圆工具中
                /// 参数1:第几个点,参数2:点的横坐标,参数3:点纵坐标
                point[pointIndex].x = (double)mToolBlock.Outputs["JiPianX"].Value;
                point[pointIndex].y = (double)mToolBlock.Outputs["JiPianY"].Value;
            }
            mFitCircle.InputImage = mImageFileTool.OutputImage;  //将图像文件工具的最后一张输入到拟合圆工具中
            mFitCircle.Run();  //运行拟合圆工具
            /* 方法二:两点一角度计算旋转中心 */
            //Point centerPoint = new Point();
            //centerPoint = calCenter(point[0], point[1], 2.5);
            cogRecordDisplay.Record = mFitCircle.CreateLastRunRecord().SubRecords["InputImage"];  //显示拟合圆工具的结果图像
            fitXTextBox.Text = mFitCircle.Result.GetCircle().CenterX.ToString("F");  //显示利用拟合圆工具确定的旋转中心的横坐标X
            fitYTextBox.Text = mFitCircle.Result.GetCircle().CenterY.ToString("F");  //显示利用拟合圆工具确定的旋转中心的纵坐标Y
        }
        /* 迭代法计算旋转中心 */
        Point calCenter(Point point1, Point point2, double theath)
        {
            double distance = Math.Pow(Math.Pow(point2.x - point1.x, 2) + Math.Pow(point2.y - point1.y, 2), 0.5);  //distance为两点之间的距离
            double radius = (distance / 2) / Math.Sin(theath / 2);
            double xt = (1 - radius / distance) * point1.x + (radius / distance) * point2.x;  //xt为垂线段
            double yt = (1 - radius / distance) * point1.y + (radius / distance) * point2.y;  //yt为垂线段
            double b = ((90.0 / 180) * Math.PI) - (theath / 2);  //角度转换
            double x = Math.Cos(Math.PI / 2 - theath / 2)*(xt - point1.x) - Math.Sin(Math.PI / 2 -theath / 2)*(yt - point1.y) + point1.x
            double y = Math.Cos(Math.PI / 2 - theath / 2)*(xt - point1.x) - Math.Sin(Math.PI / 2 -theath / 2)*(yt - point1.y) + point1.y
            Point centerPoint = new Point(x, y);
            return centerPoint;
        }
        /* 当点击查看标定按键时运行 */
        private void btnCheckCalib_Click(object sender, EventArgs e)
        {
            FitCircleToolForm fitCircleToolForm = new FitCircleToolForm(mFitCircle);
            fitCircleToolForm.ShowDialog();  //打开FitCircleToolForm窗体
        }
    }
}

2.ToolBlockForm窗体代码

2.1思路解析

Step1 跨窗口传入参数,传入ToolBlock。

public ToolBlockForm(CogToolBlock tempToolBlock)
{
    /* 跨窗口传入参数 */
    mToolBlock = tempToolBlock;  //工具块
    InitializeComponent();
}

Step2 实例化工具块并显示到窗体中。

/* 当打开窗体时运行 */
        private void ToolBlockForm_Load(object sender, EventArgs e)
        {
            cogToolBlockEdit.Subject = mToolBlock;
        }

Step3 关闭窗体时,提示是否保存VPP。

/* 当关闭窗体时运行 */
        private void ToolBlockForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult res = MessageBox.Show("是否保存?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);  //保存结果信息
            /// 参数1:显示文本,参数2:标题,参数3:按键类型,参数4:显示图标
            if (res == DialogResult.Yes)  //保存VPP
            {
                CogSerializer.SaveObjectToFile(cogToolBlockEdit.Subject, CenterCalib.MainForm.vppPath);  //保存工具块
                e.Cancel = false;  //确认关闭窗体
            }
            else if (res == DialogResult.No)  //不保存VPP
            {
                e.Cancel = false;  //确认关闭窗体
            }
            else  //取消
            {
                e.Cancel = true;  //取消关闭窗体
            }
        }

2.2源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;

namespace CenterCalib
{
    public partial class ToolBlockForm : Form
    {
        CogToolBlock mToolBlock;
        public ToolBlockForm(CogToolBlock tempToolBlock)
        {
            /* 跨窗口传入参数 */
            mToolBlock = tempToolBlock;  //工具块
            InitializeComponent();
        }
        /* 当打开窗体时运行 */
        private void ToolBlockForm_Load(object sender, EventArgs e)
        {
            cogToolBlockEdit.Subject = mToolBlock;
        }
        /* 当关闭窗体时运行 */
        private void ToolBlockForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult res = MessageBox.Show("是否保存?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);  //保存结果信息
            /// 参数1:显示文本,参数2:标题,参数3:按键类型,参数4:显示图标
            if (res == DialogResult.Yes)  //保存VPP
            {
                CogSerializer.SaveObjectToFile(cogToolBlockEdit.Subject, CenterCalib.MainForm.vppPath);  //保存工具块
                e.Cancel = false;  //确认关闭窗体
            }
            else if (res == DialogResult.No)  //不保存VPP
            {
                e.Cancel = false;  //确认关闭窗体
            }
            else  //取消
            {
                e.Cancel = true;  //取消关闭窗体
            }
        }
    }
}

3.FitCircleToolForm

3.1思路解析

Step1 跨窗口传入参数,传入ToolBlock。

public FitCircleToolForm(CogFitCircleTool tempFitCircleTool)
{
    /* 跨窗口传入参数 */
    mFitCircleTool = tempFitCircleTool;  //拟合圆工具
    InitializeComponent();
}

Step2 实例化拟合圆工具并显示到窗体中。

/* 当打开窗体时运行 */
        private void FitCircleToolForm_Load(object sender, EventArgs e)
        {
            cogFitCircleEdit.Subject = mFitCircleTool;
        }

3.2源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;

namespace CenterCalib
{
    public partial class FitCircleToolForm : Form
    {
        CogFitCircleTool mFitCircleTool;
        public FitCircleToolForm(CogFitCircleTool tempFitCircleTool)
        {
            /* 跨窗口传入参数 */
            mFitCircleTool = tempFitCircleTool;  //拟合圆工具
            InitializeComponent();
        }
        /* 当打开窗体时运行 */
        private void FitCircleToolForm_Load(object sender, EventArgs e)
        {
            cogFitCircleEdit.Subject = mFitCircleTool;
        }
    }
}

运行结果

  • 13
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: VisionPro是一款视觉系统开发平台,提供了丰富的工具和功能,用于图像处理和分析。VisionPro二次开发是指在VisionPro的基础上进行个性化定制和扩展,以满足特定应用需求。 VisionPro二次开发可以通过编写自定义的算法和脚本来实现。用户可以使用VisionPro提供的算法库和API,根据自己的需求进行算法的扩展和修改,以达到更好的图像处理效果。 此外,VisionPro还提供了友好的界面和工具,可以通过拖拽、配置等方式,快速定制图像处理的流程。用户可以根据自己的需求,选择合适的工具和参数配置,来完成特定的图像处理任务。 VisionPro二次开发也涉及到与其他系统的集成。用户可以通过编写插件或接口,将VisionPro与其他设备或软件进行连接,实现数据的共享和交互。通过与其他系统的集成,可以扩展VisionPro的应用范围,提高系统的整体效能。 总之,VisionPro二次开发是一项在原来基础上进行个性化定制和扩展的工作,通过算法的扩展、界面的定制以及与其他系统的集成,来实现更灵活、更高效的图像处理和分析功能。 ### 回答2: VisionPro是一款先进的机器视觉软件,广泛用于工业自动化领域。visionpro二次开发是指在VisionPro软件基础上进行二次开发,根据实际需求进行定制化的开发工作。 VisionPro二次开发的目的是为了满足特定的需求或解决特定的问题。通过二次开发,可以添加新的图像处理算法、优化现有的功能、增加用户界面、集成外部设备或应用程序等。这样可以提高VisionPro的适用性和灵活性,使其更好地适应各种不同的应用场景。 在进行VisionPro二次开发时,首先需要了解和熟悉VisionPro的基本功能和特性。然后根据需要,进行软件开发、算法设计、界面设计等工作。开发完成后,还需要进行测试和调试,确保开发的功能符合要求并且可以稳定运行。 VisionPro二次开发的好处是可以根据实际需求进行定制化开发,使其更好地适应特定的应用场景。这样可以提高生产效率、降低生产成本,并且提供更好的产品质量控制。此外,VisionPro二次开发还可以提供更多的功能和选择,提高系统的灵活性和扩展性。 总之,VisionPro二次开发是一项重要的工作,可以定制化开发机器视觉应用程序,提高生产效率和质量控制的能力。这需要专业的技术团队和广泛的行业经验,以确保开发的软件能够满足实际需求并可靠运行。 ### 回答3: VisionPro是一款强大的图像处理软件,可用于实现机器视觉应用。VisionPro二次开发是指在基础软件上进行定制开发,以满足特定的应用需求。 VisionPro二次开发可以通过以下几个步骤实施: 首先,需要对应用需求进行详细的调研和分析。了解客户的具体需求,明确所需实现的功能和目标。 其次,根据需求分析的结果,制定开发方案和计划。确定所需功能的开发方式和技术手段,以及开发的时间和资源投入。 接下来,进行软件定制开发。根据方案和计划,对VisionPro软件进行二次开发。根据具体的需求,可以通过编写脚本、开发插件或接口等方式,实现所需的功能扩展或定制。 在开发过程中,需要对功能进行测试和调试,确保软件的稳定性和可靠性。可以利用模拟数据或实际图像数据进行测试,对开发的功能进行验证和优化。 最后,进行部署和应用集成。将二次开发VisionPro应用集成到实际的生产环境中,与其他设备或系统进行连接和交互。并对系统进行使用培训,使用户能够熟练操作和维护该应用。 VisionPro二次开发的好处在于可以根据需求进行定制开发,满足特定的应用场景和功能要求。通过二次开发,可以扩展和增强VisionPro的功能,提高图像处理的精确度和效率。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值