WPF做了一个VisionPro的小程序

  最近一直在学习WPF,就试着用WPF做了一个小Demo,其中涉及到了很多东西;

  1. WPF如何添加VisionPro的控件;
  2. VisionPro二次开发中如何加载程序;
  3. VisionPro二次开发如何加载图片;
  4. VisionPro二次开发如何实时的更改参数;
  5. VisionPro二次开发如何获取结果,图片结果;
  6. VisionPro二次开发如何在图像上增加图形;

正题开始:

新建WPF程序应该是中间这个,不是下面那个,下面的使用不了;

 项目属性做更改,取消32位首选

一、WPF中如何添加VisionPro的控件呢?

VisionPro中并没有WPF控件,只能像添加Winforms控件一样来添加了,其中需要引用两个重要的Dll,System.Windows.Forms与WindowsFormsIntegration 有可能找不到,没关系可以下载Everyting软件进行搜索,方便有快捷,下载地址如下:下载 - voidtools  超级好用的小工具,搜索那是相当的快,推荐!

WPF中引用后如何添加VisionPro控件呢?代码来了

xmlns:Cog="clr-namespace:Cognex.VisionPro;assembly=Cognex.VisionPro.Controls"

********************************************************************


 <WindowsFormsHost>
     <Cog:CogRecordDisplay x:Name="cogdisplay"/>
 </WindowsFormsHost>

上面需要引用对应库,下面添加控件,给他名称,后台代码用名称实现逻辑就可以了。

二、VisionPro二次开发中如何加载程序

像Winforms一样先添加引用,再后台代码中添加对应的引用

using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;

如我要使用Toolblock工具来进行加载对应的程序,就必须引用这两个库,

CogToolBlock  toolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(String Path)Path为绝对路径,需要对应的扩展名的;CogJobManager  也是同样的方法;

 三、VisionPro二次开发如何加载图片

using Cognex.VisionPro.ImageFile;

CogImageFileTool  imgCog = new CogImageFileTool(); 

 imgCog.Operator.Open(string Path, CogImageFileModeConstants.Read);

后面的 CogImageFileModeConstants.Read是必须要带的,读取图片;

加载图片有什么用呢?如果我们的Toolblock需要不同的图片,给Toolblock一个输入图片,就可以切换图片来运行Toolblock了。

Image即为我们所需要输入的图片,同样的FilterLowValue、FilterHighValue就是我们需要输入的参数,那该如何将我们需要的参数,图片输入到我们的程序中去呢?

四、VisionPro二次开发如何实时的更改参数

CogToolBlock  toolBlock=new  CogToolBlock();

//设置输入的参数,后面的数值也可以替换为Textbox的数值,进行int转换就可以了

toolBlock.Inputs["FilterLowValue"].Value = 5050;
toolBlock.Inputs["FilterHighValue"].Value = 8050;

只需要使用Inputs[名称].Value的值就可以了,后面的数值可以使用Textbox来进行输入;

五、 VisionPro二次开发如何获取结果,图片结果

 程序都准备好了,我们该如何获取图片的结果呢?还有我们需要的结果呢?

这里是不是有三个截图图像,我们需要那一个就通过下面的代码取哪一张图,图像索引是通过0开始的,这里就是显示了第一张图;

//toolBlock中的工具组创建结果图像
ICogRecord cogRecord = toolBlock.CreateLastRunRecord();
//取出序号为0的图像
cogdisplay.Record = cogRecord.SubRecords[0];
//图像结果显示在控件上,并适应大小
cogdisplay.AutoFit = true;

同样的这里我获取了Blob工具个数,然后进行了二次判断,当Blob的个数大于零就为True,小于零就为Fail; 

 if ((bool)(toolBlock.Outputs["InspectionPassed"].Value) == true)
 {

     //结果判断
     Result.Text = "OK";

      //改变字体颜色
     Result.Foreground = new SolidColorBrush(Colors.Green);

      //改变字体样式
     Result.FontWeight = FontWeights.Bold;
 }

 else
 {
     Result.Text = "NG";
     Result.Foreground = new SolidColorBrush(Colors.Red);
     Result.FontWeight = FontWeights.Bold;

 }

这里通过了Outputs[对应名称].Value来进行判断;这就获取到了我们需要的数据。

六、VisionPro二次开发如何在图像上增加图形

在图像上增加十字线,增加圆形,标签等,都可以直接添加,当然也可以在VisionPro程序中添加,那样比较麻烦,而且不容易修改。在实时图像中添加图像也可以让我们更好的做项目,这个大家后期可能会碰到,也是我现在做的时候需要的。嘻嘻

那该如何添加图像呢?

//创建线工具
CogLine line1 = new CogLine();
//设置颜色
line1.Color = CogColorConstants.Red;
//线的坐标,这里只有一个坐标,不是两点一线吗?这里线visionPro是默认为水平线的,所以个点就确定了位置
line1.X = nwidth / 2 + Convert.ToDouble(StepX.Text); //需要double、int类型
line1.Y = nHeight / 2 - Convert.ToDouble(StepY.Text);
//绘制在我们的控件上面
cogdisplay.StaticGraphics.Add(line1, "line1");
CogLine line2 = new CogLine();
line2.Color = CogColorConstants.Red;
//取巧  第二个线进行了旋转
line2.SetXYRotation(line1.X, line1.Y, Math.PI / 2);
cogdisplay.StaticGraphics.Add(line2, "line2");

基本上就这么多了吧,下面是源码,有需要自取吧!

七、源代码

WPF前面UI 代码   做的比较丑,不要介意哈,O(∩_∩)O哈哈~

<Window x:Class="WPF.Learn.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Cog="clr-namespace:Cognex.VisionPro;assembly=Cognex.VisionPro.Controls"
        xmlns:local="clr-namespace:WPF.Learn"
        mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="600">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <WindowsFormsHost>
            <Cog:CogRecordDisplay x:Name="cogdisplay"/>
        </WindowsFormsHost>
        <Grid Grid.Row="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal">
                <Button Content="加载程序" x:Name="LoadCogVpp" Margin="5" Click="LoadCogVpp_Click"/>
                <Button Content="运行程序" x:Name="RunVPP" Margin="5" Click="RunVPP_Click"/>
                <RadioButton Content="圆形" x:Name="Circle" VerticalAlignment="Center" Margin="5,0" IsChecked="True"/>
                <RadioButton Content="矩形" x:Name="Rectangle" VerticalAlignment="Center" Margin="5,0"/>
                <RadioButton Content="无图形" x:Name="Nothing" VerticalAlignment="Center" Margin="5,0"/>
            </StackPanel>
            <UniformGrid Grid.Row="2" Columns="4" Rows="3" Margin="5">
                <TextBlock Text="矩形宽:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                <TextBox Width="50" Height="15" HorizontalAlignment="Left" Margin="5,0" x:Name="RectWidth" Text="50"/>
                <TextBlock Text="矩形高:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                <TextBox Width="50" Height="15" HorizontalAlignment="Left" Margin="5,0" x:Name="RectHeight" Text="20"/>
                <TextBlock Text="圆形半径:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                <TextBox Width="50" Height="15" HorizontalAlignment="Left" Margin="5,0" x:Name="Radius" Text="100"/>
                <TextBlock  HorizontalAlignment="Right" VerticalAlignment="Center" >
                    <Run Text="结果"/>
                    <Run Text="" x:Name="Result" Foreground="Green" FontWeight="Bold"/>
                </TextBlock>
                <TextBlock Text=""/>
                <TextBlock Text="偏移X:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                <TextBox Width="50" Height="15" HorizontalAlignment="Left" Margin="5,0" x:Name="StepX" Text="0"/>
                <TextBlock Text="偏移Y:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                <TextBox Width="50" Height="15" HorizontalAlignment="Left" Margin="5,0" x:Name="StepY" Text="0"/>

            </UniformGrid>
        </Grid>
    </Grid>
</Window>

后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static System.Net.Mime.MediaTypeNames;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
using System.Windows.Forms;
using Cognex.VisionPro.Blob;
using Cognex.VisionPro.ImageFile;

namespace WPF.Learn
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {

        CogToolBlock toolBlock;
        CogBlobTool cogBlob;
        CogImageFileTool imgCog;


        public MainWindow()
        {
            InitializeComponent();

        }

        private void LoadCogVpp_Click(object sender, RoutedEventArgs e)
        {
            //加载Toolblock的文件,后面是绝对位置String类型
            toolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile("D:\\Program Files\\VisionPro\\samples\\Programming\\ToolBlock\\ToolBlockLoad\\TB.vpp");
            //加载Toolblock所需要的图片文件,同样的需要再Vpp程序里面增加输入的功能
            imgCog = new CogImageFileTool();
            imgCog.Operator.Open("D:\\Program Files\\VisionPro\\Images\\coins.idb", CogImageFileModeConstants.Read);
            //获取Toolblock程序里面Blob工具,名称就是程序里面的名称,可以进行修改,建议英文
            cogBlob = (CogBlobTool)toolBlock.Tools["CogBlobTool1"];
            //设置输入的参数,后面的数值也可以替换为Textbox的数值,进行int转换就可以了
            toolBlock.Inputs["FilterLowValue"].Value = 5050;
            toolBlock.Inputs["FilterHighValue"].Value = 8050;
        }


        private void RunVPP_Click(object sender, RoutedEventArgs e)
        {
            //CogImageFileTool必须运行才可以取到对应的图
            imgCog.Run();
            //注意这里需要进行8位图的转换,将图片传入Toolblock程序
            toolBlock.Inputs["Image"].Value = imgCog.OutputImage as CogImage8Grey;
            //Toolblock工具进行运行
            toolBlock.Run();
            //toolBlock中的工具组创建结果图像
            ICogRecord cogRecord = toolBlock.CreateLastRunRecord();
            //取出序号为0的图像
            cogdisplay.Record = cogRecord.SubRecords[0];
            //图像结果显示在控件上,并适应大小
            cogdisplay.AutoFit = true;

            //结果显示出来
            if ((bool)(toolBlock.Outputs["InspectionPassed"].Value) == true)
            {
                Result.Text = "OK";
                Result.Foreground = new SolidColorBrush(Colors.Green);
                Result.FontWeight = FontWeights.Bold;
            }

            else
            {
                Result.Text = "NG";
                Result.Foreground = new SolidColorBrush(Colors.Red);
                Result.FontWeight = FontWeights.Bold;

            }




            //图像上画图形
            DrawGraphics();
        }

        private void DrawGraphics()
        {
            //这里取巧使用了Blob工具的输入图像,一般为Toolblock的输入图片
            cogBlob.Run();
            int nwidth = cogBlob.InputImage.Width;
            int nHeight = cogBlob.InputImage.Height;
            //创建线工具
            CogLine line1 = new CogLine();
            //设置颜色
            line1.Color = CogColorConstants.Red;
            //线的坐标,这里只有一个坐标,不是两点一线吗?这里线visionPro是默认为水平线的,所以个点就确定了位置
            line1.X = nwidth / 2 + Convert.ToDouble(StepX.Text);
            line1.Y = nHeight / 2 - Convert.ToDouble(StepY.Text);
            //绘制在我们的控件上面
            cogdisplay.StaticGraphics.Add(line1, "line1");
            CogLine line2 = new CogLine();
            line2.Color = CogColorConstants.Red;
            //取巧  第二个线进行了旋转
            line2.SetXYRotation(line1.X, line1.Y, Math.PI / 2);
            cogdisplay.StaticGraphics.Add(line2, "line2");

            if (Circle.IsChecked == true)
            {
                //创建圆  就不一一解释了
                CogCircle drawCicle = new CogCircle();
                drawCicle.CenterX = nwidth / 2 + Convert.ToDouble(StepX.Text);
                drawCicle.CenterY = nHeight / 2 - Convert.ToDouble(StepY.Text);
                drawCicle.Radius = Convert.ToDouble(Radius.Text);
                drawCicle.Color = CogColorConstants.Red;
                cogdisplay.StaticGraphics.Add(drawCicle, "drawCicle");
            }
            else if (Rectangle.IsChecked == true)
            {
                //创建矩形  就不一一解释了
                CogRectangle rect = new CogRectangle();
                rect.Width = Convert.ToDouble(RectWidth.Text);
                rect.Height = Convert.ToDouble(RectHeight.Text);
                rect.Color = CogColorConstants.Red;
                rect.X = nwidth / 2 - rect.Width / 2 + Convert.ToDouble(StepX.Text);
                rect.Y = nHeight / 2 - rect.Height / 2 - Convert.ToDouble(StepY.Text);
                cogdisplay.StaticGraphics.Add(rect, "rect");
            }
            else
            {
                //清除所画的所有图形
                cogdisplay.StaticGraphics.Clear();
            }

        }
    }
}

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值