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

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


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