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

简介: 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());
            }
        }
    }
}


相关文章
|
3月前
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
106 3
|
1月前
|
C#
C#中的数组型参数学习笔记
C#中的数组型参数学习笔记
25 0
|
3月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
73 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
64 0
|
3月前
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
62 0
|
3月前
|
前端开发 C# Windows
WPF/C#:如何实现拖拉元素
WPF/C#:如何实现拖拉元素
50 0
|
3月前
|
存储 C# 索引
WPF/C#:BusinessLayerValidation
WPF/C#:BusinessLayerValidation
33 0
|
3月前
|
C#
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
41 0