halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)

本文使用dispatcherTimer计时器,指定间隔时间,完成一次相机图片实时采集。在halcon18和WPF .Net Framwork4.7.2实测有效。

首先完成halcon在wpf中的配置halcon联合c#、WPF学习笔记一(WPF配置halcon)
加入命名空间using HalconDotNet;

一、在halcon中编写相机采集的程序

* Image Acquisition 02: Code generated by Image Acquisition 02
*获取相机
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] ', 0, -1, AcqHandle)
*设置相机参数
set_framegrabber_param (AcqHandle, 'grab_timeout', 2000)
*启动相机
grab_image_start (AcqHandle, -1)
while (true)
    *从相机中获取图片
    grab_image_async (Image, AcqHandle, -1)
    *获得图片的宽高
    get_image_size (Image, Width, Height)
    *设置窗口显示区域(整张图)
    dev_set_part (0, 0, Height, Width)
    *展示图片
    dev_display (Image)
    * Image Acquisition 02: Do something
endwhile
*关闭相机
close_framegrabber (AcqHandle)

然后导出成c#

二、WPF界面

在主窗口中,放一个HWindowControlWPF和三个Button
在这里插入图片描述
并将HWindowControlWPF 的Name取为Name=“halconVideo”, 后续需要和窗体绑定

三、打开相机

先在类中定义一些变量

	DispatcherTimer dispatcherTimer = null;
	HObject ho_Image = null;//从相机中采集的图
	HTuple hv_AcqHandle = null;//相机句柄
	HTuple hv_WindowHandle = new HTuple();//窗口句柄
	HTuple hv_Width = new HTuple();//图片的宽
	HTuple hv_Height = new HTuple();//图片的高

点击按钮 打开相机,将执行以下部分。
这部分直接从生成的c#代码中拷贝即可。

 		//打开相机
        private void Button_Click(object sender, RoutedEventArgs e)
        {
    
       
            
            HOperatorSet.GenEmptyObj(out ho_Image);
            hv_AcqHandle = new HTuple();
            //Image Acquisition 01: Code generated by Image Acquisition 01
            hv_AcqHandle.Dispose();
            HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
                -1, "false", "default", "[0] ", 0, -1, out hv_AcqHandle);
            HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "grab_timeout", 2000);//设置相机参数
            HOperatorSet.GrabImageStart(hv_AcqHandle, -1);//打开相机句柄
        }

四、采集显示

单击按钮 采集显示 将会执行以下内容
1.打开定时器(每间隔一段时间就执行事件(从相机中采集图片))
2.打开窗口

使用dispatcherTimer前记得加入命名空间using System.Windows.Threading;

 		private void Button_Click_1(object sender, RoutedEventArgs e)
        {
    
    
            //启动定时器
            dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);//添加事件(到达时间间隔后会自动调用)
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);//设置时间间隔为1秒
            dispatcherTimer.Start();//启动定时器

            //打开窗口(关联控件)
            HOperatorSet.OpenWindow(0, 0, halconVideo.Width, halconVideo.Height, halconVideo.HalconWindow, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);
        }

定义事件(采集图片)
直接从导出的c#中拷贝

		//计时器时间(从相机中采图并显示)
        private void dispatcherTimer_Tick(object sender, EventArgs e)//计时执行的程序
        {
    
    
            ho_Image.Dispose();
            HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);//获取图片

            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);//获取图片的宽和高
         

            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);//设置显示的范围
                HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());//显示图片
            }

        }

注意这两个句柄的区别:
hv_WindowHandle 窗口句柄 (绑定HWindowControlWPF控件,并放入HDevWindowStack堆栈中)
hv_AcqHandle 相机 (从相机采图)

最后将采集来的图,通过HDevWindowStack的栈顶的窗体(hv_WindowHandle),显示从相机采集来的图

五、关闭相机

直接从导出的C#代码拷贝

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
    
    
            HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            ho_Image.Dispose();
            
        }

六、完整代码

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:test02"
        xmlns:HalconDotNet="clr-namespace:HalconDotNet;assembly=halcondotnet" x:Class="test02.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <HalconDotNet:HWindowControlWPF Name="halconVideo" HorizontalAlignment="Left" Height="241" Margin="79,86,0,0" VerticalAlignment="Top" Width="407"/>
        <Button Content="打开相机" HorizontalAlignment="Left" Height="62" Margin="554,86,0,0" VerticalAlignment="Top" Width="180" Click="Button_Click"/>
        <Button  Content="采集显示" HorizontalAlignment="Left" Height="59" Margin="554,177,0,0" VerticalAlignment="Top" Width="180" Click="Button_Click_1"/>
        <Button Content="关闭相机" HorizontalAlignment="Left" Height="53" Margin="554,256,0,0" VerticalAlignment="Top" Width="180" Click="Button_Click_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 System.Windows.Threading;
namespace test02
{
    
    
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
    
    
        
        DispatcherTimer dispatcherTimer = null;
        HObject ho_Image = null;//从相机中采集的图
        HTuple hv_AcqHandle = null;//相机句柄
        HTuple hv_WindowHandle = new HTuple();//窗口句柄
        HTuple hv_Width = new HTuple();//图片的宽
        HTuple hv_Height = new HTuple();//图片的高
        public MainWindow()
        {
    
    
            InitializeComponent();
        }


        //打开相机
        private void Button_Click(object sender, RoutedEventArgs e)
        {
    
       
            
            HOperatorSet.GenEmptyObj(out ho_Image);
            hv_AcqHandle = new HTuple();
            //Image Acquisition 01: Code generated by Image Acquisition 01
            hv_AcqHandle.Dispose();
            HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
                -1, "false", "default", "[0] ", 0, -1, out hv_AcqHandle);
            HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "grab_timeout", 2000);//设置相机参数
            HOperatorSet.GrabImageStart(hv_AcqHandle, -1);//打开相机句柄
        }

        //采集显示
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
    
    
            //启动定时器
            dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);//添加事件(到达时间间隔后会自动调用)
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);//设置时间间隔为1秒
            dispatcherTimer.Start();//启动定时器

            //打开窗口
            HOperatorSet.OpenWindow(0, 0, halconVideo.Width, halconVideo.Height, halconVideo.HalconWindow, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);


            
        }

        //计时器时间(从相机中采图并显示)
        private void dispatcherTimer_Tick(object sender, EventArgs e)//计时执行的程序
        {
    
    
            ho_Image.Dispose();
            HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);//获取图片

            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);//获取图片的宽和高
         

            if (HDevWindowStack.IsOpen())
            {
    
    
                HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);//设置显示的范围
                HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());//显示图片
            }

        }

        //关闭相机
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
    
    
            HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            ho_Image.Dispose();
            
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_21539375/article/details/121284944