halcon联合c#、WPF学习笔记二(简单案例)

一、Halcon导出c#代码

首先在halcon内部完成代码编码,并导出成c#

在halcon中将下面代码复制到代码编辑界面

read_image (Image, ''C:/Users/xhd/Desktop/image/5.png')
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 77, 250)
dev_display (Regions)

然后 文件->导出->选择保存的目录,输出选择c#。

第三部分的部分程序,可以从生成的cs文件中的private void action()拷贝过去。

二、新建WPF工程并编辑界面

首先要完成WPF对于Halcon的配置halcon联合c#、WPF学习笔记一(WPF配置halcon)

接着拖动一些组件, HWindowControlWPF和3个Button,完成界面的编辑

在这里插入图片描述
它们的xmal
(注意给HWindowControlWPF的Name属性取值,因为后面需要访问)

<Button Content="采集图片" HorizontalAlignment="Left" Height="50" Margin="36,62,0,0" VerticalAlignment="Top" Width="152"  Grid.Column="2" Click="Button_Click"/>
<Button Content="处理图片" HorizontalAlignment="Left" Height="50" Margin="36,275,0,0" VerticalAlignment="Top" Width="152" Grid.Column="2" Click="Button_Click_2"/>
<Button Content="显示图片" HorizontalAlignment="Left" Height="50" Margin="36,173,0,0" VerticalAlignment="Top" Width="152" Grid.Column="2" Click="Button_Click_1"/>
<HalconDotNet:HWindowControlWPF Name="halconVideo" HorizontalAlignment="Left" Height="238" Margin="109,76,0,0" VerticalAlignment="Top" Width="332" Grid.ColumnSpan="2"/>

三、采集图片按钮

对于按钮
在这里插入图片描述

单击采集图片,为了能获得这种效果,使我们能够选择图片加载,这就是OpenFileDialog的效果

在这里插入图片描述

为了实现OpenFileDialog效果
要加入命名空间

using Microsoft.Win32;

实现能够选择文件路径

private void Button_Click(object sender, RoutedEventArgs e)
        {
    
    
            //创建OpenFileDialog对象
            OpenFileDialog dlg = new OpenFileDialog();
            //在过滤出jpg,png,bmp后缀的图片
            dlg.Filter = "PIC文件|*.jpg;*.png;*.bmp";
			//接受是否打开
            Nullable<bool> result = dlg.ShowDialog();
			
            if (result == true)
            {
    
    
            	//接受图片路径
                string ImagePath = dlg.FileName;
            }


        }

然后添加读取图片的代码(可以从导出的c#代码中拷贝,然后再修改一下即可)
完整代码

private void Button_Click(object sender, RoutedEventArgs e)
        {
    
    
            
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "PIC文件|*.jpg;*.png;*.bmp";

            Nullable<bool> result = dlg.ShowDialog();


            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_GrayImage);
            HOperatorSet.GenEmptyObj(out ho_Regions);
            ho_Image.Dispose();


            if (result == true)
            {
    
    
                // Open document 
                string ImagePath = dlg.FileName;
                HOperatorSet.ReadImage(out ho_Image, ImagePath);
            }

            MessageBox.Show("读取成功");

        }

实现的效果,获得图片的路径ImagePath
在这里插入图片描述

四、显示图片

先在MainWindow类下定义全局变量

HObject ho_Image, ho_GrayImage, ho_Regions;
HTuple hv_WindowHandle = new HTuple();

对于按钮
在这里插入图片描述

首先要打开窗口
对应于halcon中的dev_open_window
将OpenWindow中的第3、4个参数改成窗体控件的大小
在xaml HWindowControlWPF Name="halconVideo"已经进行对窗体进行了命名
将窗体的宽度改成控件的宽和高,第5个参数是窗口句柄,改成控件的句柄HalconWindow

HOperatorSet.OpenWindow(0, 0, halconVideo.Width,halconVideo.Height,halconVideo.HalconWindow, "visible", "", out hv_WindowHandle);

然后往窗口堆栈中加入句柄

HDevWindowStack.Push(hv_WindowHandle);

最后是显示图片,对应于dev_display

完整代码

private void Button_Click_1(object sender, RoutedEventArgs e)
        {
    
    	
        	//打开窗口,得到一个该窗口的句柄
            HOperatorSet.OpenWindow(0, 0, halconVideo.Width,halconVideo.Height,halconVideo.HalconWindow, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);//堆栈中加入句柄
			//显示图片
            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
            }
        }

得到的效果
在这里插入图片描述

五、处理图片

只是简单的进行转换为灰度图和二值化,最后再调用显示图片即可
(在使用图像变量前,一般先用Dispose清空)
完整代码

private void Button_Click_2(object sender, RoutedEventArgs e)
        {
    
    
        	//RGB转为灰度图
            ho_GrayImage.Dispose();
            HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage);
            //二值化
            ho_Regions.Dispose();
            HOperatorSet.Threshold(ho_GrayImage, out ho_Regions, 77, 250);
			//显示图片
            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.DispObj(ho_Regions, HDevWindowStack.GetActive());
            }
        }

得到的效果
在这里插入图片描述

六、完整代码

MainWindow.xaml

<Window
        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:local="clr-namespace:test01"
        xmlns:HalconDotNet="clr-namespace:HalconDotNet;assembly=halcondotnet" x:Class="test01.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="347*"/>
            <ColumnDefinition Width="182*"/>
            <ColumnDefinition Width="263*"/>
        </Grid.ColumnDefinitions>
        <Button Content="采集图片" HorizontalAlignment="Left" Height="50" Margin="36,62,0,0" VerticalAlignment="Top" Width="152"  Grid.Column="2" Click="Button_Click"/>
        <Button Content="处理图片" HorizontalAlignment="Left" Height="50" Margin="36,275,0,0" VerticalAlignment="Top" Width="152" Grid.Column="2" Click="Button_Click_2"/>
        <Button Content="显示图片" HorizontalAlignment="Left" Height="50" Margin="36,173,0,0" VerticalAlignment="Top" Width="152" Grid.Column="2" Click="Button_Click_1"/>
        <HalconDotNet:HWindowControlWPF Name="halconVideo" HorizontalAlignment="Left" Height="238" Margin="109,76,0,0" VerticalAlignment="Top" Width="332" Grid.ColumnSpan="2"/>

    </Grid>
</Window>

MainWIndow.xaml.cs

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.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using HalconDotNet;
using Microsoft.Win32;
namespace test01
{
    
    
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
    
    
        public MainWindow()
        {
    
    
            InitializeComponent();
        }

        HObject ho_Image, ho_GrayImage, ho_Regions;
        HTuple hv_WindowHandle = new HTuple();

        

        private void Button_Click(object sender, RoutedEventArgs e)
        {
    
    
            
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "PIC文件|*.jpg;*.png;*.bmp";

            Nullable<bool> result = dlg.ShowDialog();


            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_GrayImage);
            HOperatorSet.GenEmptyObj(out ho_Regions);
            ho_Image.Dispose();


            if (result == true)
            {
    
    
                // Open document 
                string ImagePath = dlg.FileName;
                HOperatorSet.ReadImage(out ho_Image, ImagePath);
            }

            MessageBox.Show("读取成功");

        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
    
    
            HOperatorSet.OpenWindow(0, 0, halconVideo.Width,halconVideo.Height,halconVideo.HalconWindow, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);

            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
            }
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
    
    
            ho_GrayImage.Dispose();
            HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage);
            ho_Regions.Dispose();
            HOperatorSet.Threshold(ho_GrayImage, out ho_Regions, 77, 250);

            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.DispObj(ho_Regions, HDevWindowStack.GetActive());
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_21539375/article/details/121276038