一、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()); } } } }